defmodule ExshomeClock.Services.UtcTime do @moduledoc """ UTC time dependency. """ use Exshome.Dependency.GenServerDependency, name: "utc_time" defmodule Opts do @moduledoc """ UtcTimeService options. """ defstruct [:refresh_interval, :precision] @type t() :: %__MODULE__{ refresh_interval: non_neg_integer(), precision: :microsecond | :millisecond | :second } end @impl GenServerDependency def on_init(state) do schedule_next_tick(state) end @impl GenServerDependency def parse_opts(opts) do %Opts{ refresh_interval: opts[:refresh_interval] || 200, precision: opts[:precision] || :second } end @impl GenServerDependency def handle_info(:tick, state) do new_state = schedule_next_tick(state) {:noreply, new_state} end def schedule_next_tick(%DependencyState{opts: %Opts{} = opts} = state) do update_interval = opts.refresh_interval Process.send_after(self(), :tick, update_interval) update_value(state, prepare_value(opts)) end def prepare_value(%Opts{precision: precision}) do DateTime.truncate(DateTime.utc_now(), precision) end end