83 lines
1.9 KiB
Go
83 lines
1.9 KiB
Go
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
|
|
|
|
package folio
|
|
|
|
import (
|
|
"decl/internal/transport"
|
|
"decl/internal/data"
|
|
"decl/internal/mapper"
|
|
"errors"
|
|
"log/slog"
|
|
"net/url"
|
|
)
|
|
|
|
|
|
var (
|
|
ErrInvalidResourceURI error = errors.New("Invalid resource URI")
|
|
)
|
|
|
|
type ContentReader interface {
|
|
ContentReaderStream() (*transport.Reader, error)
|
|
}
|
|
|
|
type ContentWriter interface {
|
|
ContentWriterStream() (*transport.Writer, error)
|
|
}
|
|
|
|
type ContentReadWriter interface {
|
|
ContentReader
|
|
ContentWriter
|
|
}
|
|
|
|
type ResourceReference URI
|
|
|
|
// Return a Content ReadWriter for the resource referred to.
|
|
func (r ResourceReference) Lookup(look mapper.Map[URI, *Declaration]) ContentReadWriter {
|
|
if string(r) == "" {
|
|
return nil
|
|
}
|
|
slog.Info("ResourceReference.Lookup()", "resourcereference", r, "resourcemapper", look)
|
|
if look != nil {
|
|
if v,ok := look.Get(URI(r)); ok {
|
|
slog.Info("ResourceReference.Lookup()", "resourcereference", r, "result", v.Resource())
|
|
return v.Resource().(ContentReadWriter)
|
|
}
|
|
}
|
|
return r
|
|
}
|
|
|
|
func (r ResourceReference) Dereference(look mapper.Map[URI, *Declaration]) data.Resource {
|
|
slog.Info("ResourceReference.Dereference()", "resourcereference", r, "resourcemapper", look)
|
|
if look != nil {
|
|
if v,ok := look.Get(URI(r)); ok {
|
|
slog.Info("ResourceReference.Dereference()", "resourcereference", r, "result", v)
|
|
return v.Attributes
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (r ResourceReference) Parse() *url.URL {
|
|
return URI(r).Parse().URL()
|
|
}
|
|
|
|
func (r ResourceReference) Exists() bool {
|
|
return URI(r).Exists()
|
|
}
|
|
|
|
func (r ResourceReference) ContentReaderStream() (*transport.Reader, error) {
|
|
return URI(r).ContentReaderStream()
|
|
}
|
|
|
|
func (r ResourceReference) ContentWriterStream() (*transport.Writer, error) {
|
|
return URI(r).ContentWriterStream()
|
|
}
|
|
|
|
func (r ResourceReference) IsEmpty() bool {
|
|
return URI(r).IsEmpty()
|
|
}
|
|
|
|
func (r *ResourceReference) FindIn(s *SearchPath) {
|
|
(*URI)(r).FindIn(s)
|
|
}
|