lib/connect/util.ex

defmodule OnePassword.Connect.Util do
  alias OnePassword.Connect.Vault

  @spec get_password(vault :: Vault.t(), item_name :: String.t()) ::
          {:ok, String.t()} | {:error, :not_found}
  def get_password(%Vault{items: items}, item_name) do
    Enum.find(items, %{}, fn item -> item.title == item_name end)
    |> Map.get(:fields, [])
    |> Enum.find({:error, :not_found}, fn field -> field.id == "password" end)
    |> then(fn
      {:error, err} ->
        {:error, err}

      res ->
        {:ok, res.value}
    end)
  end

  def get_password!(vault, item_name) do
    get_password(vault, item_name)
    |> case do
      {:error, _err} ->
        throw("Key #{item_name} not found in vault #{vault.name}")

      {:ok, value} ->
        value
    end
  end
end