diff --git a/src/rt/rfwfs/main.ts b/src/rt/rfwfs/main.ts index 44d4e28..36d6d72 100644 --- a/src/rt/rfwfs/main.ts +++ b/src/rt/rfwfs/main.ts @@ -34,10 +34,10 @@ interface EntryCollectionManipulate { } interface Rfwfs { - directory: (name: string, permissions: Permissions, timestamp: number, inner_default: T[]) => EntryCollection, + directory: (default_name: string, permissions: Permissions, timestamp: number, inner_default?: T[]) => EntryCollection, is_file: (entry: T) => boolean, is_dir: (entry: T) => boolean, - file: (name: string, permissions: Permissions, timestamp: number, inner_default: FileInner) => EntryFile, + file: (default_name: string, permissions: Permissions, timestamp: number, inner_default?: FileInner) => EntryFile, } function read_write_access(permissions: Permissions): boolean { @@ -90,6 +90,17 @@ function directory_pop(self: EntryCollection, file_name: str return wrap_entry(ReadStatus.Denied) } +function directory_clone(self: EntryCollection, file_name: string): WrapResultEntry { + if (read_write_access(self.permissions)) { + const clone_find = directory_search(self.inner.__body, file_name) + if (clone_find) { + return wrap_entry(ReadStatus.Ok, { ...clone_find.result }) + } + return wrap_entry(ReadStatus.NotFound) + } + return wrap_entry(ReadStatus.Denied) +} + function file_inner_read(self: EntryFileInner, permissions: Permissions): FileInner | undefined { return read_access(permissions) ? self.__body : undefined } @@ -111,10 +122,11 @@ function file_inner(permissions: Permissions, inner_default: FileInner): EntryFi function dir_inner(self: EntryCollection, collection: T[]): EntryCollectionManipulate { const collection_trait = { __body: collection } as EntryCollectionManipulate - collection_trait.pop = function(file_name) { return directory_pop(self, file_name) } - collection_trait.find = function(file_name) { return directory_find(self, file_name) } - collection_trait.push = function(entry) { return directory_push(self, entry) } - collection_trait.sort = function() { return directory_sort(this) } + collection_trait.clone = function(file_name) { return directory_clone(self, file_name) } + collection_trait.pop = function(file_name) { return directory_pop(self, file_name) } + collection_trait.find = function(file_name) { return directory_find(self, file_name) } + collection_trait.push = function(entry) { return directory_push(self, entry) } + collection_trait.sort = function() { return directory_sort(this) } collection_trait.sort() //the default collection is automatically sorted on directory creation. return collection_trait } @@ -128,23 +140,31 @@ rfwfs.is_file = function(entry) { return entry.type === EntryType.File } -rfwfs.file = function(name, permissions, timestamp, inner_default) { +rfwfs.file = function(default_name, permissions, timestamp, inner_default) { const file = { type: EntryType.File } as EntryFile file.permissions = permissions file.timestamp = timestamp - file.inner = file_inner(permissions, inner_default) - file.name = name + file.inner = file_inner(permissions, inner_default ? inner_default : "") + file.name = default_name file.hash = "0" return file } -rfwfs.directory = function(name: string, permissions: Permissions, timestamp: number, inner_default: T[]): EntryCollection { +rfwfs.directory = function(default_name: string, permissions: Permissions, timestamp: number, inner_default?: T[]): EntryCollection { const directory = { type: EntryType.Directory } as EntryCollection directory.permissions = permissions directory.timestamp = timestamp - directory.inner = dir_inner(directory, inner_default) - directory.name = name + directory.inner = dir_inner(directory, inner_default ? inner_default : []) + directory.name = default_name return directory } -export default rfwfs \ No newline at end of file +export default rfwfs +export { + type FileInner, + type Entry, + type EntryFile, + type EntryFileInner, + type EntryCollection, + type EntryCollectionManipulate, +} \ No newline at end of file