# Copyright(c) 2015-2023 ACCESS CO., LTD. All rights reserved.
use Croma
defmodule AntikytheraCore.Context do
alias Antikythera.{Time, GearName, ContextId, NodeId}
alias Antikythera.Context, as: LContext
alias Antikythera.Context.GearEntryPoint
alias Antikythera.ExecutorPool.Id, as: EPoolId
alias AntikytheraCore.Cluster.NodeId, as: CoreNodeId
defun make(
gear_name :: v[GearName.t()],
entry_point :: v[nil | GearEntryPoint.t()],
context_id :: v[nil | ContextId.t()] \\ nil,
epool_id :: v[nil | EPoolId.t()] \\ nil
) :: LContext.t() do
now = Time.now()
%LContext{
start_time: now,
context_id: context_id || make_context_id(now),
gear_name: gear_name,
executor_pool_id: epool_id,
gear_entry_point: entry_point
}
end
defun make_context_id(t :: v[Time.t()]) :: ContextId.t() do
make_context_id(t, CoreNodeId.get())
end
defun make_context_id(t :: v[Time.t()], node_id :: v[NodeId.t()]) :: v[ContextId.t()] do
[
timestamp(t),
node_id,
:erlang.pid_to_list(self()) |> tl() |> List.to_string() |> String.trim_trailing(">")
]
|> Enum.join("_")
end
defunp timestamp({_, {y, mon, d}, {h, minute, s}, ms} :: Time.t()) :: String.t() do
import Antikythera.StringFormat
"#{y}#{pad2(mon)}#{pad2(d)}-#{pad2(h)}#{pad2(minute)}#{pad2(s)}.#{pad3(ms)}"
end
end