defmodule Membrane.Protocol.SDP.Encryption do @moduledoc """ This module represents Encryption field of SDP that stores encryption key or acquisition method of such key. Session key should be present IFF the transport medium is secure. For more details please see [RFC4566 Section 5.12](https://tools.ietf.org/html/rfc4566#section-5.12) """ @enforce_keys [:method] defstruct @enforce_keys ++ [:key] @type methods :: :prompt | :base64 | :clear | :prompt @type t :: %__MODULE__{ method: methods(), key: binary() | nil } @spec parse(binary()) :: {:ok, t()} | {:error, :unsupported_method} def parse(definition) do with {method, key} <- parse_definition(definition), {:ok, method} <- method_to_atom(method) do encryption = %__MODULE__{ method: method, key: key } {:ok, encryption} end end defp parse_definition(definition) do case String.split(definition, ":", parts: 2) do [method] -> {method, nil} [method, key] -> {method, key} end end defp method_to_atom(method) defp method_to_atom("prompt"), do: {:ok, :prompt} defp method_to_atom("clear"), do: {:ok, :clear} defp method_to_atom("base64"), do: {:ok, :base64} defp method_to_atom("uri"), do: {:ok, :uri} defp method_to_atom(_), do: {:error, :unsupported_method} end