defmodule WorkloadService.Aggregates.ApplicationId do @moduledoc """ Application identifier with org_id, application_id, and policy_type. Used to track which policy-service application this task belongs to. """ @derive Jason.Encoder defstruct [:org_id, :application_id, :policy_type] def new(org_id, application_id, policy_type) do %__MODULE__{ org_id: org_id, application_id: application_id, policy_type: policy_type } end def parse(map) when is_map(map) do case map do %{org_id: org_id, application_id: application_id, policy_type: policy_type} -> {:ok, new(org_id, application_id, policy_type)} _ -> {:error, :invalid_application_id} end end def parse!(map) do case parse(map) do {:ok, id} -> id {:error, reason} -> raise ArgumentError, "invalid application_id #{inspect(map)}: #{reason}" end end defimpl String.Chars do def to_string(%WorkloadService.Aggregates.ApplicationId{ org_id: org_id, application_id: application_id, policy_type: policy_type }) do "#{org_id}:#{policy_type}:#{application_id}" end end defimpl Commanded.Serialization.JsonDecoder do def decode(%{org_id: org_id, application_id: application_id, policy_type: policy_type}) do WorkloadService.Aggregates.ApplicationId.new(org_id, application_id, policy_type) end def decode(id), do: id end end