defprotocol GitHub.Auth do @moduledoc """ Protocol for extracting API authentication tokens from application structs Credentials can be passed to operations using the `auth` option as strings (for tokens) or 2-tuples (for client ID / secret or username / password). Sometimes, it's more convenient to pass a struct — like as a user struct — and extract the auth token from that. By implementing this protocol, the client can extract an auth token from the given struct without additional work by the caller. ## Example defimpl GitHub.Auth, for: MyApp.User do def to_auth(%MyApp.User{github_token: token}), do: token end """ @typedoc "Auth token accepted by the client" @type auth :: nil | (token :: String.t()) | {username_or_client_id :: String.t(), password_or_client_secret :: String.t()} @doc """ Extract an auth token from the given struct The returned data should be in the form of a string (for a Bearer token) or a 2-tuple (for a Basic Auth user/password pair). """ @spec to_auth(t) :: auth def to_auth(value) end