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