defmodule PolicyService.Aggregates.PolicyId do @derive Jason.Encoder defstruct [:org_id, :policy_type, :application_id] def new(org_id, policy_type, application_id) do %__MODULE__{ org_id: org_id, policy_type: policy_type, application_id: application_id } end def parse(string) when is_binary(string) do case String.split(string, ":", parts: 3) do [org_id, policy_type, application_id] -> {:ok, %__MODULE__{ org_id: org_id, policy_type: policy_type, application_id: application_id }} _ -> {:error, :invalid_policy_id} end end def parse!(string) do case parse(string) do {:ok, id} -> id {:error, reason} -> raise ArgumentError, "invalid policy id #{inspect(string)}: #{reason}" end end defimpl String.Chars do def to_string(%PolicyService.Aggregates.PolicyId{ org_id: org_id, policy_type: policy_type, application_id: application_id }) do org_id <> ":" <> policy_type <> ":" <> application_id end end defimpl Commanded.Serialization.JsonDecoder do def decode(%{org_id: org_id, policy_type: policy_type, application_id: application_id}) do PolicyService.Aggregates.PolicyId.new(org_id, policy_type, application_id) end def decode(id), do: id end end