Implements a resource catalog backed by a resource store.
class base resource catalog
implements resource catalog, reference[dictionary[string, resource identifier] or null]
implicit import ideal • library • patterns
implicit import ideal • runtime • patterns
private static pattern[character] scheme separator : singleton pattern[character] • new(':')
private static pattern[character] path separator : singleton pattern[character] • new('/')
private resource store the resource store
private string the scheme
private immutable list[string] path
protected base resource catalog(resource store the resource store, string the scheme, immutable list[string] path)
this • the resource store = the resource store
this • the scheme = the scheme
this • path = path
override dictionary[string, resource identifier] or null get()
if catalog is null
return missing • instance
for (resource name : catalog • elements)
result • put(resource name, resolve(resource name))
return result
override void set(dictionary[string, resource identifier] or null new value)
utilities • panic("can't set a catalog")
overload implement resource identifier resolve(string name)
if name • is empty if scheme range is_not null
candidate scheme : name • slice(0, scheme range • begin)
if !the resource store • allow scheme(candidate scheme)
utilities • panic("scheme " ++ candidate scheme ++ " not allowed")
components : path separator • split(name • skip(scheme range • end))
return base resource identifier • new(the resource store, candidate scheme, components • frozen copy() !> immutable list[string])
result : base list[string] • new()
if components • first • is empty
if the resource store • allow up
absolute = true
else
pass
index = 1
else
index = 0
result • append all(path)
while index < components • size
component : components[index] !> string
index += 1
if component • is empty || component == resource util • CURRENT CATALOG
continue
else if component == resource util • PARENT CATALOG
if result • is empty
if the resource store • allow up
result • append(component)
else
pass
else
if result • last == resource util • PARENT CATALOG
result • append(component)
else
result • remove last()
else
result • append(component)
if absolute
result • prepend("")
else if result • is empty
overload implement resource identifier resolve(string name, extension or null the extension)
if the extension is_not null
return resolve(base string • new(name, the extension • dot name))
else
return resolve(name)
override string to string => get id() • to string