From 56790cbe1d2b84645ca8979290e10d64d2190d92 Mon Sep 17 00:00:00 2001 From: rhpidfyre Date: Sat, 22 Mar 2025 21:29:44 -0400 Subject: [PATCH] Binary file time --- src/rt/rfwfs/enum.ts | 21 +++-- src/rt/rfwfs/main.ts | 177 ++++++++++++++++++++++++++++++++----------- src/rt/rfwfs/wrap.ts | 17 +++-- 3 files changed, 156 insertions(+), 59 deletions(-) diff --git a/src/rt/rfwfs/enum.ts b/src/rt/rfwfs/enum.ts index 1687546..c202b31 100644 --- a/src/rt/rfwfs/enum.ts +++ b/src/rt/rfwfs/enum.ts @@ -1,17 +1,13 @@ type ConstEnum = number const enum EntryType { + Root, + File, Directory, Binary, - File, } + const enum Permissions { - r, - w, - rw, - none, -} -const enum PermissionsBinary { r, w, x, @@ -21,16 +17,25 @@ const enum PermissionsBinary { wx, none, } + const enum PushStatus { Ok, Duplicate, Denied, } + const enum ReadStatus { Ok, NotFound, Denied, } + +const enum ExecuteStatus { + Ok, + Panic, + Denied, +} + const enum Option { Ok, None, @@ -38,7 +43,7 @@ const enum Option { export { type ConstEnum, - PermissionsBinary, + ExecuteStatus, Permissions, PushStatus, ReadStatus, diff --git a/src/rt/rfwfs/main.ts b/src/rt/rfwfs/main.ts index 1bd4653..1414dbe 100644 --- a/src/rt/rfwfs/main.ts +++ b/src/rt/rfwfs/main.ts @@ -1,47 +1,64 @@ -import { EntryType, PushStatus, ReadStatus, Permissions, ConstEnum, PermissionsBinary } from "./enum" -import { wrap_entry, wrap_none, WrapResultEntry, WrapResultNone } from "./wrap" +import { EntryType, PushStatus, ReadStatus, Permissions, ExecuteStatus } from "./enum" +import { wrap_entry, wrap_none, type WrapResultEntry, type WrapResultNone, type WrapBinary, wrap_binary } from "./wrap" import directory_search from "./index" type FileInner = string | number +type BinaryError = string -interface Entry { +type BinaryEntry = () => EntryStripped +type BinaryLambda = (binary_entry: BinaryEntry) => void + +type Directory = EntryCollection +type DirectoryAny = EntryCollection +type DirectoryAnyDepth = EntryCollection + +interface Root { + readonly type: EntryType, + inner: T[], +} +interface EntryStripped { + readonly type: EntryType, permissions: Permissions, timestamp: EntryValue, name: EntryValue, - readonly type: EntryType, } - +interface Entry extends EntryStripped { + parent: DirectoryAny, +} interface EntryFile extends Entry { inner: EntryValue, hash: string, } - interface EntryCollection extends Entry { inner: RfwfsDirectory, } - -interface Rfwfs { - directory: (default_name: string, default_permissions: Permissions, default_timestamp?: number, default_inner?: T[]) => EntryCollection, - file: (default_name: string, default_permissions: Permissions, default_timestamp?: number, default_inner?: FileInner) => EntryFile, - is_binary: (entry: T) => boolean, - is_file: (entry: T) => boolean, - is_dir: (entry: T) => boolean, +interface EntryBinary extends Entry { + inner: RfwfsBinary } -function execute_access

(permissions: P): boolean { - return permissions === PermissionsBinary.rwx - || permissions === PermissionsBinary.rx - || permissions === PermissionsBinary.wx - || permissions === PermissionsBinary.x +function strip_entry(entry: T): EntryStripped { + return { + type: entry.type, + permissions: entry.permissions, + timestamp: entry.timestamp, + name: entry.name, + } } -function read_write_access

(permissions: P): boolean { + +function execute_access(permissions: Permissions): boolean { + return permissions === Permissions.rwx + || permissions === Permissions.rx + || permissions === Permissions.wx + || permissions === Permissions.x +} +function read_write_access(permissions: Permissions): boolean { return permissions === Permissions.rw } -function read_access

(permissions: P): boolean { +function read_access(permissions: Permissions): boolean { return read_write_access(permissions) || permissions === Permissions.r } -function write_access

(permissions: P): boolean { +function write_access(permissions: Permissions): boolean { return read_write_access(permissions) || permissions === Permissions.w } @@ -69,7 +86,7 @@ class EntryValue { class RfwfsDirectory { public directory: T[]; - protected entry: Entry + protected entry: Entry; constructor(entry: Entry, directory: T[]) { this.directory = directory @@ -128,41 +145,109 @@ class RfwfsDirectory { } } -const rfwfs = {} as Rfwfs +class RfwfsBinary { + public lambda: BinaryLambda; + protected entry: Entry; -rfwfs.is_dir = function(entry) { - return entry.type === EntryType.Directory -} -rfwfs.is_file = function(entry) { - return entry.type === EntryType.File -} -rfwfs.is_binary = function(entry) { - return entry.type === EntryType.Binary + constructor(entry: Entry, lambda: BinaryLambda) { + this.lambda = lambda + this.entry = entry + } + + public execute(): WrapBinary { + if (execute_access(this.entry.permissions)) { + try { + this.lambda(() => strip_entry(this.entry)) + } catch(binary_e) { + return wrap_binary(ExecuteStatus.Panic, (binary_e as object).toString()) + } + return wrap_binary(ExecuteStatus.Ok) + } + return wrap_binary(ExecuteStatus.Denied) + } } -rfwfs.file = function(default_name, default_permissions, default_timestamp, default_inner) { - const file = { type: EntryType.File } as EntryFile - file.hash = "0" - file.permissions = default_permissions - file.timestamp = new EntryValue(file, default_timestamp ? default_timestamp : (Date.now()/1000)|0) - file.inner = new EntryValue(file, default_inner ? default_inner : "") - file.name = new EntryValue(file, default_name) - return file +class rfwfs_static { + public static is_dir(entry: T): boolean { + return entry.type === EntryType.Directory + } + public static is_file(entry: T): boolean { + return entry.type === EntryType.File + } + public static is_binary(entry: T): boolean { + return entry.type === EntryType.Binary + } + public static is_root(entry: Root): boolean { + return entry.type === EntryType.Root + } } -rfwfs.directory = function(default_name: string, default_permissions: Permissions, default_timestamp?: number, default_inner?: T[]): EntryCollection { - const directory = { type: EntryType.Directory } as EntryCollection - directory.permissions = default_permissions - directory.timestamp = new EntryValue(directory, default_timestamp ? default_timestamp : (Date.now()/1000)|0) - directory.inner = new RfwfsDirectory(directory, default_inner ? default_inner : []) - directory.name = new EntryValue(directory, default_name) - return directory +class rfwfs extends rfwfs_static { + protected root: Root; + + constructor(inner: T[]) { + super() + this.root = { type: EntryType.Root, inner: inner } + } + + public file( + default_name: string, + default_permissions: Permissions, + default_parent: DirectoryAny, + default_timestamp?: number, + default_inner?: FileInner + ): EntryFile { + const file = { type: EntryType.File } as EntryFile + file.hash = "0" + file.parent = default_parent + file.permissions = default_permissions + file.timestamp = new EntryValue(file, default_timestamp ? default_timestamp : (Date.now()/1000)|0) + file.inner = new EntryValue(file, default_inner ? default_inner : "") + file.name = new EntryValue(file, default_name) + return file + } + + public directory( + default_name: string, + default_permissions: Permissions, + default_parent: DirectoryAny, + default_timestamp?: number, + default_inner?: T[] + ): EntryCollection { + const directory = { type: EntryType.Directory } as EntryCollection + directory.parent = default_parent + directory.permissions = default_permissions + directory.timestamp = new EntryValue(directory, default_timestamp ? default_timestamp : (Date.now()/1000)|0) + directory.inner = new RfwfsDirectory(directory, default_inner ? default_inner : []) + directory.name = new EntryValue(directory, default_name) + return directory + } + + public binary( + default_name: string, + default_permissions: Permissions, + default_parent: DirectoryAny, + default_timestamp?: number, + default_inner?: BinaryLambda + ): EntryBinary { + const binary = { type: EntryType.Binary } as EntryBinary + binary.parent = default_parent + binary.permissions = default_permissions + binary.timestamp = new EntryValue(binary, default_timestamp ? default_timestamp : (Date.now()/1000)|0) + binary.inner = new RfwfsBinary(binary, default_inner ? default_inner : () => {}) + binary.name = new EntryValue(binary, default_name) + return binary + } } export default rfwfs export { type EntryCollection, + type DirectoryAnyDepth, type RfwfsDirectory, + type DirectoryAny, + type BinaryError, + type Directory, type FileInner, type EntryFile, type Entry, diff --git a/src/rt/rfwfs/wrap.ts b/src/rt/rfwfs/wrap.ts index f59b88a..fa02143 100644 --- a/src/rt/rfwfs/wrap.ts +++ b/src/rt/rfwfs/wrap.ts @@ -1,9 +1,10 @@ -import { Option, type ConstEnum } from "./enum" -import { type Entry } from "./main" +import { ExecuteStatus, Option, type ConstEnum } from "./enum" +import { type BinaryError, type Entry } from "./main" type WrapResultEntry = WrapResult type WrapBSearch = WrapResult type WrapResultNone = WrapResult +type WrapBinary = WrapResult interface WrapResult { /** The resulting value if `U` is a success status */ @@ -28,13 +29,19 @@ function wrap_none(status: T): WrapResultNone { return wrap(Option.None, status) } +function wrap_binary(status: ExecuteStatus, result?: BinaryError): WrapBinary { + return wrap(status, result) +} + export default wrap export { - wrap_bsearch, - wrap_entry, - wrap_none, type WrapResultEntry, type WrapResultNone, type WrapBSearch, type WrapResult, + type WrapBinary, + wrap_bsearch, + wrap_binary, + wrap_entry, + wrap_none, }