rqjs_ext/modules/fs/
mod.rs

1mod access;
2mod mkdir;
3mod read_dir;
4mod read_file;
5mod rm;
6mod stats;
7mod write_file;
8
9use rquickjs::{
10    module::{Declarations, Exports, ModuleDef},
11    prelude::Func,
12};
13use rquickjs::{Class, Ctx, Object, Result};
14
15use rquickjs::function::Async;
16
17// use crate::{module_builder::ModuleInfo, modules::module::export_default};
18
19use self::access::access;
20use self::read_dir::{read_dir, read_dir_sync, Dirent};
21use self::read_file::{read_file, read_file_sync};
22use self::rm::{rmdir, rmfile};
23use self::stats::{stat_fn, Stat};
24use self::write_file::write_file;
25
26use crate::modules::fs::{
27    access::access_sync,
28    mkdir::{mkdir, mkdir_sync, mkdtemp, mkdtemp_sync},
29    rm::{rmdir_sync, rmfile_sync},
30    stats::stat_fn_sync,
31    write_file::write_file_sync,
32};
33
34use super::module::export_default;
35
36pub const CONSTANT_F_OK: u32 = 0;
37pub const CONSTANT_R_OK: u32 = 4;
38pub const CONSTANT_W_OK: u32 = 2;
39pub const CONSTANT_X_OK: u32 = 1;
40
41pub struct FsPromisesModule;
42
43impl ModuleDef for FsPromisesModule {
44    fn declare(declare: &Declarations<'_>) -> Result<()> {
45        declare.declare("access")?;
46        declare.declare("open")?;
47        declare.declare("readFile")?;
48        declare.declare("writeFile")?;
49        declare.declare("appendFile")?;
50        declare.declare("copyFile")?;
51        declare.declare("rename")?;
52        declare.declare("readdir")?;
53        declare.declare("mkdir")?;
54        declare.declare("mkdtemp")?;
55        declare.declare("rm")?;
56        declare.declare("rmdir")?;
57        declare.declare("stat")?;
58        declare.declare("constants")?;
59
60        declare.declare("default")?;
61
62        Ok(())
63    }
64
65    fn evaluate<'js>(ctx: &Ctx<'js>, exports: &Exports<'js>) -> Result<()> {
66        Class::<Dirent>::register(ctx)?;
67        Class::<Stat>::register(ctx)?;
68
69        export_default(ctx, exports, |default| {
70            export_promises(ctx, default)?;
71
72            Ok(())
73        })
74    }
75}
76
77// impl From<FsPromisesModule> for ModuleInfo<FsPromisesModule> {
78//     fn from(val: FsPromisesModule) -> Self {
79//         ModuleInfo {
80//             name: "fs/promises",
81//             module: val,
82//         }
83//     }
84// }
85
86pub struct FsModule;
87
88impl ModuleDef for FsModule {
89    fn declare(declare: &Declarations<'_>) -> Result<()> {
90        declare.declare("promises")?;
91        declare.declare("accessSync")?;
92        declare.declare("mkdirSync")?;
93        declare.declare("mkdtempSync")?;
94        declare.declare("readdirSync")?;
95        declare.declare("readFileSync")?;
96        declare.declare("rmdirSync")?;
97        declare.declare("rmSync")?;
98        declare.declare("statSync")?;
99        declare.declare("writeFileSync")?;
100
101        declare.declare("default")?;
102
103        Ok(())
104    }
105
106    fn evaluate<'js>(ctx: &Ctx<'js>, exports: &Exports<'js>) -> Result<()> {
107        Class::<Dirent>::register(ctx)?;
108        Class::<Stat>::register(ctx)?;
109
110        export_default(ctx, exports, |default| {
111            let promises = Object::new(ctx.clone())?;
112            export_promises(ctx, &promises)?;
113
114            default.set("promises", promises)?;
115            default.set("accessSync", Func::from(access_sync))?;
116            default.set("mkdirSync", Func::from(mkdir_sync))?;
117            default.set("mkdtempSync", Func::from(mkdtemp_sync))?;
118            default.set("readdirSync", Func::from(read_dir_sync))?;
119            default.set("readFileSync", Func::from(read_file_sync))?;
120            default.set("rmdirSync", Func::from(rmdir_sync))?;
121            default.set("rmSync", Func::from(rmfile_sync))?;
122            default.set("statSync", Func::from(stat_fn_sync))?;
123            default.set("writeFileSync", Func::from(write_file_sync))?;
124
125            Ok(())
126        })
127    }
128}
129
130fn export_promises<'js>(ctx: &Ctx<'js>, exports: &Object<'js>) -> Result<()> {
131    let constants = Object::new(ctx.clone())?;
132    constants.set("F_OK", CONSTANT_F_OK)?;
133    constants.set("R_OK", CONSTANT_R_OK)?;
134    constants.set("W_OK", CONSTANT_W_OK)?;
135    constants.set("X_OK", CONSTANT_X_OK)?;
136
137    exports.set("readdir", Func::from(Async(read_dir)))?;
138    exports.set("readFile", Func::from(Async(read_file)))?;
139    exports.set("writeFile", Func::from(Async(write_file)))?;
140    exports.set("mkdir", Func::from(Async(mkdir)))?;
141    exports.set("mkdtemp", Func::from(Async(mkdtemp)))?;
142    exports.set("rmdir", Func::from(Async(rmdir)))?;
143    exports.set("rm", Func::from(Async(rmfile)))?;
144    exports.set("stat", Func::from(Async(stat_fn)))?;
145    exports.set("access", Func::from(Async(access)))?;
146
147    exports.set("constants", constants)?;
148
149    Ok(())
150}
151
152// impl From<FsModule> for ModuleInfo<FsModule> {
153//     fn from(val: FsModule) -> Self {
154//         ModuleInfo {
155//             name: "fs",
156//             module: val,
157//         }
158//     }
159// }