Skip to content

Commit a3d63d8

Browse files
committed
file.append, file.append_bits
1 parent b67cdec commit a3d63d8

File tree

3 files changed

+97
-3
lines changed

3 files changed

+97
-3
lines changed

src/gleam/erlang/file.gleam

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,57 @@ external fn do_write_bits(
310310
) -> Result(Nil, Reason) =
311311
"gleam_erlang_ffi" "write_file"
312312

313+
/// Append the given String contents to a file of the given name.
314+
///
315+
/// Returns a Result with Nil if the operation was successful or a Reason
316+
/// otherwise.
317+
///
318+
/// ## Examples
319+
///
320+
/// > append("Hello, World!", "file.txt")
321+
/// Ok(Nil)
322+
///
323+
/// > append(to: "file.txt", contents: "Hello, World!")
324+
/// Ok(Nil)
325+
///
326+
/// > append("Hello, World!", "does_not_exist/file.txt")
327+
/// Error(Enoent)
328+
///
329+
pub fn append(contents contents: String, to path: String) -> Result(Nil, Reason) {
330+
contents
331+
|> bit_string.from_string
332+
|> do_append_bits(path)
333+
}
334+
335+
/// Append the given BitString contents to a file of the given name.
336+
///
337+
/// Returns a Result with Nil if the operation was successful or a Reason
338+
/// otherwise.
339+
///
340+
/// ## Examples
341+
///
342+
/// > append_bits(<<71,73,70,56,57,97,1,0,1,0,0,0,0,59>>, "cat.gif")
343+
/// Ok(Nil)
344+
///
345+
/// > append_bits(to: "cat.gif", contents: <<71,73,70,56,57,97,1,0,1,0,0,0,0,59>>)
346+
/// Ok(Nil)
347+
///
348+
/// > append_bits(<<71,73,70,56,57,97,1,0,1,0,0,0,0,59>>, "does_not_exist/cat.gif")
349+
/// Error(Enoent)
350+
///
351+
pub fn append_bits(
352+
contents contents: BitString,
353+
to path: String,
354+
) -> Result(Nil, Reason) {
355+
do_append_bits(contents, path)
356+
}
357+
358+
external fn do_append_bits(
359+
contents: BitString,
360+
path: String,
361+
) -> Result(Nil, Reason) =
362+
"gleam_erlang_ffi" "append_file"
363+
313364
/// Delete the given file.
314365
///
315366
/// Returns a Result with Nil if the operation was successful or a Reason

src/gleam_erlang_ffi.erl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
-export([
33
atom_from_dynamic/1, rescue/1, atom_from_string/1, get_line/1,
44
ensure_all_started/1, sleep/1, os_family/0, sleep_forever/0, read_file/1,
5-
write_file/2, delete_file/1, get_all_env/0, get_env/1, set_env/2,
6-
unset_env/1, delete_directory/1, recursive_delete/1, list_directory/1,
7-
demonitor/1, make_directory/1, new_selector/0, link/1,
5+
append_file/2, write_file/2, delete_file/1, get_all_env/0, get_env/1,
6+
set_env/2, unset_env/1, delete_directory/1, recursive_delete/1,
7+
list_directory/1, demonitor/1, make_directory/1, new_selector/0, link/1,
88
insert_selector_handler/3, select/1, select/2, trap_exits/1, map_selector/2,
99
merge_selector/2, flush_messages/0
1010
]).
@@ -85,6 +85,9 @@ read_file(Filename) ->
8585
write_file(Contents, Filename) ->
8686
posix_result(file:write_file(Filename, Contents)).
8787

88+
append_file(Contents, Filename) ->
89+
posix_result(file:write_file(Filename, Contents, [append])).
90+
8891
delete_file(Filename) ->
8992
posix_result(file:delete(Filename)).
9093

test/gleam/erlang/file_test.gleam

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,51 @@ fn tmp_path(filename: String) {
8585
fn make_tmp_directory() {
8686
delete_tmp_directory()
8787
assert Ok(Nil) = file.make_directory(tmp_directory)
88+
Nil
8889
}
8990

9091
fn delete_tmp_directory() {
9192
assert Ok(Nil) = case file.recursive_delete(tmp_directory) {
9293
Error(file.Enoent) -> Ok(Nil)
9394
other -> other
9495
}
96+
Nil
97+
}
98+
99+
pub fn append_test() {
100+
make_tmp_directory()
101+
let path = tmp_path("success.txt")
102+
assert Error(file.Enoent) = file.read(path)
103+
104+
assert Ok(Nil) = file.append("one", path)
105+
assert Ok("one") = file.read(path)
106+
107+
assert Ok(Nil) = file.append("two", path)
108+
assert Ok("onetwo") = file.read(path)
109+
110+
assert Ok(Nil) = file.append("three", path)
111+
assert Ok("onetwothree") = file.read(path)
112+
113+
assert Ok(Nil) = file.delete(path)
114+
assert Error(file.Enoent) = file.read(path)
115+
delete_tmp_directory()
116+
}
117+
118+
pub fn append_bits_test() {
119+
make_tmp_directory()
120+
let path = tmp_path("cat.jpeg")
121+
assert Error(file.Enoent) = file.read_bits(path)
122+
123+
assert Ok(Nil) = file.append_bits(<<1>>, path)
124+
assert Ok(<<1>>) = file.read_bits(path)
125+
126+
assert Ok(Nil) = file.append_bits(<<2>>, path)
127+
assert Ok(<<1, 2>>) = file.read_bits(path)
128+
129+
assert Ok(Nil) = file.append_bits(<<3>>, path)
130+
assert Ok(<<1, 2, 3>>) = file.read_bits(path)
131+
132+
assert Ok(Nil) = file.delete(path)
133+
assert Error(file.Enoent) = file.read_bits(path)
134+
delete_tmp_directory()
95135
}

0 commit comments

Comments
 (0)