# Copyright 2021 Nicolas Jouanin # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. defmodule Polyjuice.Util.Identifiers.V1.EventIdentifier do @type t :: %__MODULE__{ sigil: String.t(), opaque_id: String.t(), domain: String.t() } alias Polyjuice.Util.Identifiers.V1.EventIdentifier @enforce_keys [:sigil, :opaque_id, :domain] defstruct [ :sigil, :opaque_id, :domain ] @sigil "$" @behaviour Polyjuice.Util.Identifiers def new!(identifier) do case parse(identifier) do {:ok, event} -> event {:error, error} -> raise ArgumentError, error end end @impl Polyjuice.Util.Identifiers def new([opaque_id, domain]), do: new(opaque_id, domain) @impl Polyjuice.Util.Identifiers def new({opaque_id, domain}), do: new(opaque_id, domain) @impl Polyjuice.Util.Identifiers def new(%{opaque_id: opaque_id, domain: domain}), do: new(opaque_id, domain) @impl Polyjuice.Util.Identifiers def new(identifier), do: parse(identifier) @spec new(String.t(), String.t()) :: {:ok, EventIdentifier.t()} | {:error, String.t()} def new(opaque_id, domain) do event = %EventIdentifier{sigil: @sigil, opaque_id: opaque_id, domain: domain} if valid?(event) do {:ok, event} else {:error, :invalid_event_id} end end @impl Polyjuice.Util.Identifiers def valid?(%EventIdentifier{} = this) do String.length(this.domain) > 0 && String.length(this.opaque_id) > 0 end @impl Polyjuice.Util.Identifiers def valid?(identifier_string) do case parse(identifier_string) do {:ok, _} -> true _ -> false end end def fqid(%EventIdentifier{} = this) do "#{@sigil}#{this.opaque_id}:#{this.domain}" end @impl Polyjuice.Util.Identifiers @spec parse(String.t()) :: {:ok, EventIdentifier.t()} | {:error, String.t()} def parse(id) do with @sigil <> id <- id do [opaque_id, domain] = String.split(id, ":", parts: 2, trim: true) new(opaque_id, domain) end end end defimpl String.Chars, for: Polyjuice.Util.Identifiers.V1.EventIdentifier do def to_string(this), do: Polyjuice.Util.Identifiers.V1.EventIdentifier.fqid(this) end