Skip to content

Commit 7eb8667

Browse files
committed
Priv directory
1 parent f3139ba commit 7eb8667

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

src/gleam/erlang.gleam

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,16 @@ pub type Reference
141141
///
142142
@external(erlang, "erlang", "make_ref")
143143
pub fn make_reference() -> Reference
144+
145+
/// Returns the path of an application's `priv` directory, where extra non-Gleam
146+
/// or Erlang files are typically kept.
147+
///
148+
/// # Example
149+
///
150+
/// ```gleam
151+
/// > erlang.priv_directory("my_app")
152+
/// // -> Ok("/some/location/my_app/priv")
153+
/// ```
154+
///
155+
@external(erlang, "gleam_erlang_ffi", "priv_directory")
156+
pub fn priv_directory(name: String) -> Result(String, Nil)

src/gleam_erlang_ffi.erl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
set_env/2, unset_env/1, delete_directory/1, recursive_delete/1,
77
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,
9-
merge_selector/2, flush_messages/0, file_info/1, link_info/1
9+
merge_selector/2, flush_messages/0, file_info/1, link_info/1,
10+
priv_directory/1
1011
]).
1112

1213
-define(is_posix_error(Error),
@@ -216,3 +217,14 @@ flush_messages() ->
216217
receive _Message -> flush_messages()
217218
after 0 -> nil
218219
end.
220+
221+
priv_directory(Name) ->
222+
try erlang:binary_to_existing_atom(Name) of
223+
Atom ->
224+
case code:priv_dir(Atom) of
225+
{error, _} -> {error, nil};
226+
Path -> {ok, unicode:characters_to_binary(Path)}
227+
end
228+
catch
229+
error:badarg -> {error, nil}
230+
end.

test/gleam/erlang_test.gleam

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import gleam/string
12
import gleam/dynamic
23
import gleam/iterator
34
import gleam/erlang.{UnknownApplication}
@@ -47,3 +48,13 @@ pub fn make_reference_test() {
4748
})
4849
|> iterator.run
4950
}
51+
52+
pub fn priv_directory_test() {
53+
let assert Error(Nil) = erlang.priv_directory("unknown_application")
54+
55+
let assert Ok(dir) = erlang.priv_directory("gleam_erlang")
56+
let assert True = string.ends_with(dir, "/gleam_erlang/priv")
57+
58+
let assert Ok(dir) = erlang.priv_directory("gleam_stdlib")
59+
let assert True = string.ends_with(dir, "/gleam_stdlib/priv")
60+
}

0 commit comments

Comments
 (0)