lib/schemas/user.ex

defmodule GitHub.User do
  @moduledoc """
  Provides struct and types for a User
  """
  use GitHub.Encoder

  @type private :: %__MODULE__{
          __info__: map,
          avatar_url: String.t(),
          bio: String.t() | nil,
          blog: String.t() | nil,
          business_plus: boolean | nil,
          collaborators: integer,
          company: String.t() | nil,
          created_at: DateTime.t(),
          disk_usage: integer,
          email: String.t() | nil,
          events_url: String.t(),
          followers: integer,
          followers_url: String.t(),
          following: integer,
          following_url: String.t(),
          gists_url: String.t(),
          gravatar_id: String.t() | nil,
          hireable: boolean | nil,
          html_url: String.t(),
          id: integer,
          ldap_dn: String.t() | nil,
          location: String.t() | nil,
          login: String.t(),
          name: String.t() | nil,
          node_id: String.t(),
          organizations_url: String.t(),
          owned_private_repos: integer,
          plan: GitHub.User.Plan.private() | nil,
          private_gists: integer,
          public_gists: integer,
          public_repos: integer,
          received_events_url: String.t(),
          repos_url: String.t(),
          site_admin: boolean,
          starred_url: String.t(),
          subscriptions_url: String.t(),
          suspended_at: DateTime.t() | nil,
          total_private_repos: integer,
          twitter_username: String.t() | nil,
          two_factor_authentication: boolean,
          type: String.t(),
          updated_at: DateTime.t(),
          url: String.t()
        }

  @type public :: %__MODULE__{
          __info__: map,
          avatar_url: String.t(),
          bio: String.t() | nil,
          blog: String.t() | nil,
          collaborators: integer | nil,
          company: String.t() | nil,
          created_at: DateTime.t(),
          disk_usage: integer | nil,
          email: String.t() | nil,
          events_url: String.t(),
          followers: integer,
          followers_url: String.t(),
          following: integer,
          following_url: String.t(),
          gists_url: String.t(),
          gravatar_id: String.t() | nil,
          hireable: boolean | nil,
          html_url: String.t(),
          id: integer,
          location: String.t() | nil,
          login: String.t(),
          name: String.t() | nil,
          node_id: String.t(),
          organizations_url: String.t(),
          owned_private_repos: integer | nil,
          plan: GitHub.User.Plan.public() | nil,
          private_gists: integer | nil,
          public_gists: integer,
          public_repos: integer,
          received_events_url: String.t(),
          repos_url: String.t(),
          site_admin: boolean,
          starred_url: String.t(),
          subscriptions_url: String.t(),
          suspended_at: DateTime.t() | nil,
          total_private_repos: integer | nil,
          twitter_username: String.t() | nil,
          type: String.t(),
          updated_at: DateTime.t(),
          url: String.t()
        }

  @type simple :: %__MODULE__{
          __info__: map,
          avatar_url: String.t(),
          email: String.t() | nil,
          events_url: String.t(),
          followers_url: String.t(),
          following_url: String.t(),
          gists_url: String.t(),
          gravatar_id: String.t() | nil,
          html_url: String.t(),
          id: integer,
          login: String.t(),
          name: String.t() | nil,
          node_id: String.t(),
          organizations_url: String.t(),
          received_events_url: String.t(),
          repos_url: String.t(),
          site_admin: boolean,
          starred_at: String.t() | nil,
          starred_url: String.t(),
          subscriptions_url: String.t(),
          type: String.t(),
          url: String.t()
        }

  defstruct [
    :__info__,
    :avatar_url,
    :bio,
    :blog,
    :business_plus,
    :collaborators,
    :company,
    :created_at,
    :disk_usage,
    :email,
    :events_url,
    :followers,
    :followers_url,
    :following,
    :following_url,
    :gists_url,
    :gravatar_id,
    :hireable,
    :html_url,
    :id,
    :ldap_dn,
    :location,
    :login,
    :name,
    :node_id,
    :organizations_url,
    :owned_private_repos,
    :plan,
    :private_gists,
    :public_gists,
    :public_repos,
    :received_events_url,
    :repos_url,
    :site_admin,
    :starred_at,
    :starred_url,
    :subscriptions_url,
    :suspended_at,
    :total_private_repos,
    :twitter_username,
    :two_factor_authentication,
    :type,
    :updated_at,
    :url
  ]

  @doc false
  @spec __fields__(atom) :: keyword
  def __fields__(:private) do
    [
      avatar_url: {:string, :uri},
      bio: {:union, [{:string, :generic}, :null]},
      blog: {:union, [{:string, :generic}, :null]},
      business_plus: :boolean,
      collaborators: :integer,
      company: {:union, [{:string, :generic}, :null]},
      created_at: {:string, :date_time},
      disk_usage: :integer,
      email: {:union, [{:string, :email}, :null]},
      events_url: {:string, :generic},
      followers: :integer,
      followers_url: {:string, :uri},
      following: :integer,
      following_url: {:string, :generic},
      gists_url: {:string, :generic},
      gravatar_id: {:union, [{:string, :generic}, :null]},
      hireable: {:union, [:boolean, :null]},
      html_url: {:string, :uri},
      id: :integer,
      ldap_dn: {:string, :generic},
      location: {:union, [{:string, :generic}, :null]},
      login: {:string, :generic},
      name: {:union, [{:string, :generic}, :null]},
      node_id: {:string, :generic},
      organizations_url: {:string, :uri},
      owned_private_repos: :integer,
      plan: {GitHub.User.Plan, :private},
      private_gists: :integer,
      public_gists: :integer,
      public_repos: :integer,
      received_events_url: {:string, :uri},
      repos_url: {:string, :uri},
      site_admin: :boolean,
      starred_url: {:string, :generic},
      subscriptions_url: {:string, :uri},
      suspended_at: {:union, [{:string, :date_time}, :null]},
      total_private_repos: :integer,
      twitter_username: {:union, [{:string, :generic}, :null]},
      two_factor_authentication: :boolean,
      type: {:string, :generic},
      updated_at: {:string, :date_time},
      url: {:string, :uri}
    ]
  end

  def __fields__(:public) do
    [
      avatar_url: {:string, :uri},
      bio: {:union, [{:string, :generic}, :null]},
      blog: {:union, [{:string, :generic}, :null]},
      collaborators: :integer,
      company: {:union, [{:string, :generic}, :null]},
      created_at: {:string, :date_time},
      disk_usage: :integer,
      email: {:union, [{:string, :email}, :null]},
      events_url: {:string, :generic},
      followers: :integer,
      followers_url: {:string, :uri},
      following: :integer,
      following_url: {:string, :generic},
      gists_url: {:string, :generic},
      gravatar_id: {:union, [{:string, :generic}, :null]},
      hireable: {:union, [:boolean, :null]},
      html_url: {:string, :uri},
      id: :integer,
      location: {:union, [{:string, :generic}, :null]},
      login: {:string, :generic},
      name: {:union, [{:string, :generic}, :null]},
      node_id: {:string, :generic},
      organizations_url: {:string, :uri},
      owned_private_repos: :integer,
      plan: {GitHub.User.Plan, :public},
      private_gists: :integer,
      public_gists: :integer,
      public_repos: :integer,
      received_events_url: {:string, :uri},
      repos_url: {:string, :uri},
      site_admin: :boolean,
      starred_url: {:string, :generic},
      subscriptions_url: {:string, :uri},
      suspended_at: {:union, [{:string, :date_time}, :null]},
      total_private_repos: :integer,
      twitter_username: {:union, [{:string, :generic}, :null]},
      type: {:string, :generic},
      updated_at: {:string, :date_time},
      url: {:string, :uri}
    ]
  end

  def __fields__(:simple) do
    [
      avatar_url: {:string, :uri},
      email: {:union, [{:string, :generic}, :null]},
      events_url: {:string, :generic},
      followers_url: {:string, :uri},
      following_url: {:string, :generic},
      gists_url: {:string, :generic},
      gravatar_id: {:union, [{:string, :generic}, :null]},
      html_url: {:string, :uri},
      id: :integer,
      login: {:string, :generic},
      name: {:union, [{:string, :generic}, :null]},
      node_id: {:string, :generic},
      organizations_url: {:string, :uri},
      received_events_url: {:string, :uri},
      repos_url: {:string, :uri},
      site_admin: :boolean,
      starred_at: {:string, :generic},
      starred_url: {:string, :generic},
      subscriptions_url: {:string, :uri},
      type: {:string, :generic},
      url: {:string, :uri}
    ]
  end
end