package atom import ( "errors" "fmt" "mime" "reflect" ) type OutOfLineContent struct { *CommonAttributes Type MediaType `xml:"type,attr,omitempty"` SRC IRI `xml:"src,attr"` } // newOutOfLineContent creates a new OutOfLineContent. It returns a // *OutOfLineContent and an error. func newOutOfLineContent(mediaType string, content any) (*OutOfLineContent, error) { if mediaType, _, err := mime.ParseMediaType(mediaType); err != nil { return nil, fmt.Errorf("media type %v incompatible with out of line content", mediaType) } if reflect.TypeOf(content).Kind() != reflect.String { return nil, fmt.Errorf("content type %T incompatible with out of line content", content) } if !isValidIRI(content.(IRI)) { return nil, errors.New("content not a valid uri") } return &OutOfLineContent{Type: MediaType(mediaType), SRC: content.(IRI)}, nil } // isContent checks whether the OutOfLineContent is a Content. It returns a // bool. func (o *OutOfLineContent) isContent() bool { return true } // hasSRC checks whether the OutOfLineContent has a SRC attribute. It returns a // bool. func (o *OutOfLineContent) hasSRC() bool { return true } // getType returns the Type of the OutOfLineContent as a string. func (o *OutOfLineContent) getType() string { return string(o.Type) } // Check checks the OutOfLineContent for incompatibilities with RFC4287. It // returns an error. func (o *OutOfLineContent) Check() error { mediaType := o.getType() if mediaType, _, err := mime.ParseMediaType(mediaType); err != nil { return fmt.Errorf("type attribute %v incompatible with out of line content", mediaType) } if isCompositeMediaType(mediaType) { return errors.New("type attribute of out of line content must not be a composite type") } if o.SRC == "" { return errors.New("src attribute of out of line content empty") } return nil }