Skip to content

Commit 9cee703

Browse files
committed
wip: implement writeFile and writeFileSync
Signed-off-by: Miguel Molina <[email protected]>
1 parent 137fcb5 commit 9cee703

File tree

3 files changed

+55
-24
lines changed

3 files changed

+55
-24
lines changed

src/fs.re

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,36 @@ let writeString = (~fd, ~string, ~offset, ~length) =>
168168
let writeStringSync = (~fd, ~string, ~offset, ~length) =>
169169
Unix.write_substring(fd, string, offset, length);
170170

171-
let writeFile = (~file, ~data, ~options) => ();
172-
173-
let writeFileSync = (~file, ~data, ~options) => ();
171+
type writeFileOptions = {
172+
encoding: option(string),
173+
mode: option(asyncFilePerm),
174+
flags: list(asyncOpenFlag)
175+
};
176+
177+
let defaultWriteFileFlags = [Unix.O_CREAT, Unix.O_TRUNC];
178+
179+
let writeFile = (~options={encoding: None, mode: None, flags: []}, ~file, ~data) => {
180+
let flags = List.length(options.flags) < 1 ? defaultWriteFileFlags : options.flags;
181+
let mode = RenodeUtils.withDefault(options.mode, ~default=438);
182+
Lwt.bind(
183+
Lwt_unix.openfile(file, flags, mode),
184+
fd => Lwt.bind(
185+
write(fd, data, 0, Bytes.length(data)),
186+
(_) => close(fd)
187+
)
188+
)
189+
};
190+
191+
type writeFileSyncOptions = {
192+
encoding: option(string),
193+
mode: option(syncFilePerm),
194+
flags: list(syncOpenFlag)
195+
};
196+
197+
let writeFileSync = (~options={encoding: None, mode: None, flags: []}, ~file, ~data) => {
198+
let flags = List.length(options.flags) < 1 ? defaultWriteFileFlags : options.flags;
199+
let mode = RenodeUtils.withDefault(options.mode, ~default=438);
200+
let fd = Unix.openfile(file, flags, mode);
201+
let _ = writeSync(fd, data, 0, Bytes.length(data));
202+
closeSync(fd);
203+
};

src/fs.rei

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -363,24 +363,20 @@ let writeString:
363363
let writeStringSync:
364364
(~fd: syncFileDescr, ~string: string, ~offset: int, ~length: int) => int;
365365

366-
[@ocaml.deprecated
367-
{|
368-
Fs.writeFile has yet to be implemented.
369-
Please open a Work-In-Progress pull request if you are interested in contributing.
370-
We will help answer questions and push you in the right direction.
371-
372-
Repo URL: https://github.com/kennetpostigo/lwt-node
373-
|}
374-
]
375-
let writeFile: (~file: 'a, ~data: 'b, ~options: 'c) => unit;
376-
377-
[@ocaml.deprecated
378-
{|
379-
Fs.writeFileSync has yet to be implemented.
380-
Please open a Work-In-Progress pull request if you are interested in contributing.
381-
We will help answer questions and push you in the right direction.
382-
383-
Repo URL: https://github.com/kennetpostigo/lwt-node
384-
|}
385-
]
386-
let writeFileSync: (~file: 'a, ~data: 'b, ~options: 'c) => unit;
366+
type writeFileOptions = {
367+
encoding: option(string),
368+
mode: option(asyncFilePerm),
369+
flags: list(asyncOpenFlag)
370+
};
371+
372+
let writeFile:
373+
(~options: writeFileOptions=?, ~file: string, ~data: bytes) => Node.t(unit);
374+
375+
type writeFileSyncOptions = {
376+
encoding: option(string),
377+
mode: option(syncFilePerm),
378+
flags: list(syncOpenFlag)
379+
};
380+
381+
let writeFileSync:
382+
(~options: writeFileSyncOptions=?, ~file: string, ~data: bytes) => unit;

src/renodeUtils.re

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,9 @@ let iterPathUntil = (~condition, ~list, ~f) => {
157157
f(arr[position^], position, ! (position^ > (-1)));
158158
position := position^ - 1;
159159
};
160+
};
161+
162+
let withDefault = (opt, ~default) => switch opt {
163+
| Some(v) => v
164+
| None => default
160165
};

0 commit comments

Comments
 (0)