From bb5d24884f1ec54357fdf87b818faf8d2b65f28e Mon Sep 17 00:00:00 2001 From: rhpidfyre Date: Sat, 29 Mar 2025 17:38:25 -0400 Subject: [PATCH] switch to using bitflags for rfwfs permissions --- src/rt/fs.ts | 14 ++++++----- src/rt/rfwfs/enum.ts | 52 -------------------------------------- src/rt/rfwfs/library.ts | 35 ++++++++++++++++++-------- src/rt/rfwfs/main.ts | 56 +++++++++++++++++++++++++++++++---------- src/rt/rfwfs/wrap.ts | 9 ++++++- 5 files changed, 83 insertions(+), 83 deletions(-) delete mode 100644 src/rt/rfwfs/enum.ts diff --git a/src/rt/fs.ts b/src/rt/fs.ts index 74f3199..60a102b 100644 --- a/src/rt/fs.ts +++ b/src/rt/fs.ts @@ -7,6 +7,7 @@ const time_now = (Date.now()/1000)|0 // ------------ Home ------------ const config = rfwfs.directory(".config", Permissions.rw, time_now) const local = rfwfs.directory(".local", Permissions.rw, time_now) + const downloads = rfwfs.directory("Downloads", Permissions.rw, time_now) const pictures = rfwfs.directory("Pictures", Permissions.rw, time_now) const desktop = rfwfs.directory("Desktop", Permissions.rw, time_now) @@ -33,9 +34,10 @@ const vard = rfwfs.directory("var", Permissions.r, time_now) const etc = rfwfs.directory("etc", Permissions.r, time_now) // ------------ -export default rfwfs.directory("/", Permissions.r, time_now, [ - bin, - home, - vard, - etc, -]) \ No newline at end of file +const fs = new rfwfs([ + +]) + +rfwfs.directory("bin", Permissions.r, fs, time_now) + +export default fs \ No newline at end of file diff --git a/src/rt/rfwfs/enum.ts b/src/rt/rfwfs/enum.ts deleted file mode 100644 index c202b31..0000000 --- a/src/rt/rfwfs/enum.ts +++ /dev/null @@ -1,52 +0,0 @@ -type ConstEnum = number - -const enum EntryType { - Root, - File, - Directory, - Binary, -} - -const enum Permissions { - r, - w, - x, - rw, - rwx, - rx, - 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, -} - -export { - type ConstEnum, - ExecuteStatus, - Permissions, - PushStatus, - ReadStatus, - EntryType, - Option, -} \ No newline at end of file diff --git a/src/rt/rfwfs/library.ts b/src/rt/rfwfs/library.ts index 43d7d69..b7c6434 100644 --- a/src/rt/rfwfs/library.ts +++ b/src/rt/rfwfs/library.ts @@ -1,22 +1,26 @@ import { ReadStatus } from "./enum" import { wrap_entry, type WrapResultEntry } from "./wrap" -import rfwfs, { type DirectoryDepth, type Directory } from "./main" +import rfwfs, { type DirectoryAny, type EntryCollection, type DirectoryAnyDepth } from "./main" import fs from "../fs" type Path = string[] -interface LibHome { - goal: (path: Path) => WrapResultEntry +interface Home { path: () => Path, - get: () => Directory | undefined, + dir: () => DirectoryAny | undefined, +} +interface Librfwfs { + home: Home, + traverse_to: (path: Path) => WrapResultEntry + pwd_entry: >(working_dir: T) => Path | undefined } let username: string = "user" -const libhome = {} as LibHome +const librfwfs = {} as Librfwfs -libhome.goal = function(path) { +librfwfs.traverse_to = function(path) { let traverse = fs for (const path_name of path) { @@ -24,7 +28,7 @@ libhome.goal = function(path) { if (find.status === ReadStatus.Ok) { if (find.result && rfwfs.is_dir(find.result)) { - traverse = find.result as DirectoryDepth + traverse = find.result as DirectoryAnyDepth } else { return wrap_entry(ReadStatus.Denied) } @@ -35,13 +39,22 @@ libhome.goal = function(path) { return wrap_entry(ReadStatus.Ok, traverse) } -libhome.path = function() { +librfwfs.pwd_entry = function(working_dir) { + +} + +librfwfs.home = {} as Home + +librfwfs.home.path = function() { return ["home", username] } -libhome.get = function() { - const traverse = this.goal(this.path()) +librfwfs.home.dir = function() { + const traverse = librfwfs.traverse_to(this.path()) return traverse.status === ReadStatus.Ok ? traverse.result : undefined } -export default libhome \ No newline at end of file +export default librfwfs +export { + username +} \ No newline at end of file diff --git a/src/rt/rfwfs/main.ts b/src/rt/rfwfs/main.ts index 1414dbe..8f17d6c 100644 --- a/src/rt/rfwfs/main.ts +++ b/src/rt/rfwfs/main.ts @@ -1,8 +1,36 @@ -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" +const enum EntryType { + Root, + File, + Directory, + Binary, +} +const enum Permissions { + r = 1<<0, + w = 1<<1, + x = 1<<2, + none = 1<<3, +} + +const enum PushStatus { + Ok, + Duplicate, + Denied, +} +const enum ReadStatus { + Ok, + NotFound, + Denied, +} +const enum ExecuteStatus { + Ok, + Panic, + Denied, +} + type FileInner = string | number type BinaryError = string @@ -46,20 +74,17 @@ function strip_entry(entry: T): EntryStripped { } } -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 + return (permissions & (Permissions.r | Permissions.w)) === (Permissions.r | Permissions.w) +} +function execute_access(permissions: Permissions): boolean { + return (permissions & Permissions.x) !== 0 } function read_access(permissions: Permissions): boolean { - return read_write_access(permissions) || permissions === Permissions.r + return (permissions & Permissions.r) !== 0 } function write_access(permissions: Permissions): boolean { - return read_write_access(permissions) || permissions === Permissions.w + return (permissions & Permissions.w) !== 0 } class EntryValue { @@ -190,7 +215,7 @@ class rfwfs extends rfwfs_static { this.root = { type: EntryType.Root, inner: inner } } - public file( + public static file( default_name: string, default_permissions: Permissions, default_parent: DirectoryAny, @@ -207,7 +232,7 @@ class rfwfs extends rfwfs_static { return file } - public directory( + public static directory( default_name: string, default_permissions: Permissions, default_parent: DirectoryAny, @@ -223,7 +248,7 @@ class rfwfs extends rfwfs_static { return directory } - public binary( + public static binary( default_name: string, default_permissions: Permissions, default_parent: DirectoryAny, @@ -251,4 +276,9 @@ export { type FileInner, type EntryFile, type Entry, + ExecuteStatus, + Permissions, + PushStatus, + ReadStatus, + EntryType, } \ No newline at end of file diff --git a/src/rt/rfwfs/wrap.ts b/src/rt/rfwfs/wrap.ts index fa02143..337a8ce 100644 --- a/src/rt/rfwfs/wrap.ts +++ b/src/rt/rfwfs/wrap.ts @@ -1,5 +1,12 @@ -import { ExecuteStatus, Option, type ConstEnum } from "./enum" import { type BinaryError, type Entry } from "./main" +import { ExecuteStatus } from "./main" + +const enum Option { + Ok, + None, +} + +type ConstEnum = number type WrapResultEntry = WrapResult type WrapBSearch = WrapResult