defmodule Fluvio do
@moduledoc """
This module provides high-level Fluvio interface for cluster functionalities.
"""
use GenServer
defmodule GenState do
@moduledoc false
defstruct native_mod: nil, fluvio_ref: nil
end
@impl true
def init(%GenState{} = gen_state) do
{:ok, gen_state}
end
@impl true
def handle_call(:connect, _from, state) do
response = state.native_mod.connect()
{:reply, response, Map.put(state, :fluvio_ref, response |> elem(1))}
end
@impl true
def handle_call(:platform_version, _from, state) do
{:reply, state.native_mod.platform_version(state.fluvio_ref), state}
end
@doc """
Starts a GenServer process linked to the current process connected to Fluvio cluster.
"""
@spec start_link(list(), any()) :: GenServer.on_start()
def start_link(gen_opts \\ [], native_mod \\ Fluvio.Native) do
case native_mod.connect() do
{:error, msg} ->
{:error, msg}
{:ok, fluvio_ref} ->
GenServer.start_link(
__MODULE__,
%GenState{native_mod: native_mod, fluvio_ref: fluvio_ref},
gen_opts
)
end
end
@doc """
Gets the platform version of the connected cluster.
"""
@spec platform_version(pid()) :: {atom(), any()}
def platform_version(pid) when is_pid(pid) do
GenServer.call(pid, :platform_version)
end
end