Current section
Files
Jump to
Current section
Files
src/opener.gleam
/// Opens a target file or URL using the appropriate platform-specific opener.
///
/// example:
/// ```gleam
/// let _ = open("https://gleam.run")
/// ```
///
pub fn open(target: String) {
get_platform_opener()
|> opener_to_exec()
|> fn(open) { open([target]) }
}
type Opener {
/// Opener for many UNIX based systems using `xdg-open`
XDGOpen
/// Opener for macOS systems using `open`
MacOSOpen
/// Opener for Windows using `start`
WindowsStart
}
fn opener_to_exec(
opener: Opener,
) -> fn(List(String)) -> Result(String, #(Int, String)) {
case opener {
MacOSOpen -> exec("open", _)
WindowsStart -> exec("start", _)
XDGOpen -> exec("xdg-open", _)
}
}
type OsType {
Linux
Darwin
NT
Unknown
}
fn get_platform_opener() -> Opener {
case get_os() {
Linux -> XDGOpen
NT -> WindowsStart
Darwin -> MacOSOpen
Unknown -> XDGOpen
}
}
@external(erlang, "opener_ffi", "get_os")
fn get_os() -> OsType
@external(erlang, "opener_ffi", "exec")
fn exec(command: String, args: List(String)) -> Result(String, #(Int, String))