Current section

Files

Jump to
gleam_erlang src gleam erlang node.gleam
Raw

src/gleam/erlang/node.gleam

import gleam/erlang/atom.{Atom}
pub type Node
type DoNotLeak
/// Return the current node.
///
@external(erlang, "erlang", "node")
pub fn self() -> Node
/// Return a list of all visible nodes in the cluster, not including the current
/// node.
///
/// The current node can be included by calling `self()` and prepending the
/// result.
///
/// ```gleam
/// let all_nodes = [node.self(), ..node.visible()]
/// ```
///
@external(erlang, "erlang", "nodes")
pub fn visible() -> List(Node)
pub type ConnectError {
/// Was unable to connect to the node.
FailedToConnect
/// The local node is not alive, so it is not possible to connect to the other
/// node.
LocalNodeIsNotAlive
}
// TODO: test unknown node
// TODO: test successfully connecting
/// Establish a connection to a node, so the nodes can send messages to each
/// other and any other connected nodes.
///
/// Returns `Error(FailedToConnect)` if the node is not reachable.
///
/// Returns `Error(LocalNodeIsNotAlive)` if the local node is not alive, meaning
/// it is not running in distributed mode.
///
@external(erlang, "gleam_erlang_ffi", "connect_node")
pub fn connect(node: Atom) -> Result(Node, ConnectError)
// TODO: test
/// Send a message to a named process on a given node.
///
/// These messages are untyped, like regular Erlang messages.
///
pub fn send(node: Node, name: Atom, message: message) -> Nil {
raw_send(#(name, node), message)
Nil
}
@external(erlang, "erlang", "send")
fn raw_send(receiver: #(Atom, Node), message: message) -> DoNotLeak
/// Convert a node to the atom of its name.
///
@external(erlang, "gleam_erlang_ffi", "identity")
pub fn to_atom(node: Node) -> Atom