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 ideallibrarypatterns
implicit import idealruntimepatterns
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 missinginstance
for (resource name : catalogelements)
resultput(resource name, resolve(resource name))
return result
override void set(dictionary[string, resource identifier] or null new value)
utilitiespanic("can't set a catalog")
overload implement resource identifier resolve(string name)
if nameis empty if scheme range is_not null
candidate scheme : nameslice(0, scheme rangebegin)
if !the resource storeallow scheme(candidate scheme)
utilitiespanic("scheme " ++ candidate scheme ++ " not allowed")
components : path separatorsplit(nameskip(scheme rangeend))
return base resource identifier • new(the resource store, candidate scheme, componentsfrozen copy() !> immutable list[string])
result : base list[string] • new()
if componentsfirstis empty
if the resource storeallow up
absolute = true
else
pass
index = 1
else
index = 0
resultappend all(path)
while index < componentssize
component : components[index] !> string
index += 1
if componentis empty || component == resource utilCURRENT CATALOG
continue
else if component == resource utilPARENT CATALOG
if resultis empty
if the resource storeallow up
resultappend(component)
else
pass
else
if resultlast == resource utilPARENT CATALOG
resultappend(component)
else
resultremove last()
else
resultappend(component)
if absolute
resultprepend("")
else if resultis 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 extensiondot name))
else
return resolve(name)
override string to string => get id() • to string