defmodule Remedy.Schema.Embed do
@moduledoc """
Discord Embed Object
"""
use Remedy.Schema
@type t :: %__MODULE__{
title: String.t(),
type: String.t(),
description: String.t(),
url: String.t(),
timestamp: ISO8601.t(),
color: integer(),
fields: [EmbedField.t()],
author: EmbedAuthor.t(),
footer: EmbedFooter.t(),
image: EmbedImage.t(),
provider: EmbedProvider.t(),
thumbnail: EmbedThumbnail.t(),
video: EmbedVideo.t()
}
embedded_schema do
field :title, :string
field :type, :string
field :description, :string
field :url, :string
field :timestamp, ISO8601
field :color, :integer
embeds_many :fields, EmbedField
embeds_one :author, EmbedAuthor
embeds_one :footer, EmbedFooter
embeds_one :image, EmbedImage
embeds_one :provider, EmbedProvider
embeds_one :thumbnail, EmbedThumbnail
embeds_one :video, EmbedVideo
end
def changeset(model \\ %__MODULE__{}, params) do
fields = __MODULE__.__schema__(:fields)
embeds = __MODULE__.__schema__(:embeds)
cast_model = cast(model, params, fields -- embeds)
Enum.reduce(embeds, cast_model, fn embed, cast_model ->
cast_embed(cast_model, embed)
end)
end
end
defmodule Remedy.Schema.EmbedAuthor do
@moduledoc """
Discord Embed Author Object
"""
use Remedy.Schema
@type t :: %__MODULE__{
name: String.t(),
url: String.t(),
icon_url: String.t(),
proxy_icon_url: String.t()
}
embedded_schema do
field :name
field :url
field :icon_url
field :proxy_icon_url
end
def changeset(model \\ %__MODULE__{}, params) do
fields = __MODULE__.__schema__(:fields)
embeds = __MODULE__.__schema__(:embeds)
cast_model = cast(model, params, fields -- embeds)
Enum.reduce(embeds, cast_model, fn embed, cast_model ->
cast_embed(cast_model, embed)
end)
end
end
defmodule Remedy.Schema.EmbedField do
@moduledoc """
Discord Embed Field Object
"""
use Remedy.Schema
@type t :: %__MODULE__{
name: String.t(),
value: String.t(),
inline: boolean()
}
embedded_schema do
field :name, :string, required: true
field :value, :string, required: true
field :inline
end
def changeset(model \\ %__MODULE__{}, params) do
fields = __MODULE__.__schema__(:fields)
embeds = __MODULE__.__schema__(:embeds)
cast_model = cast(model, params, fields -- embeds)
Enum.reduce(embeds, cast_model, fn embed, cast_model ->
cast_embed(cast_model, embed)
end)
end
end
defmodule Remedy.Schema.EmbedFooter do
@moduledoc """
Discord Embed Footer Object
"""
use Remedy.Schema
@type t :: %__MODULE__{
text: String.t(),
icon_url: String.t(),
proxy_icon_url: String.t()
}
embedded_schema do
field :text, :string, required: true
field :icon_url
field :proxy_icon_url
end
def changeset(model \\ %__MODULE__{}, params) do
fields = __MODULE__.__schema__(:fields)
embeds = __MODULE__.__schema__(:embeds)
cast_model = cast(model, params, fields -- embeds)
Enum.reduce(embeds, cast_model, fn embed, cast_model ->
cast_embed(cast_model, embed)
end)
end
end
defmodule Remedy.Schema.EmbedImage do
@moduledoc """
Discord Embed Image Object
"""
use Remedy.Schema
@type t :: %__MODULE__{
url: String.t(),
proxy_url: String.t(),
height: integer(),
width: integer()
}
embedded_schema do
field :url, :string
field :proxy_url, :string
field :height, :integer
field :width, :integer
end
def changeset(model \\ %__MODULE__{}, params) do
fields = __MODULE__.__schema__(:fields)
embeds = __MODULE__.__schema__(:embeds)
cast_model = cast(model, params, fields -- embeds)
Enum.reduce(embeds, cast_model, fn embed, cast_model ->
cast_embed(cast_model, embed)
end)
end
end
defmodule Remedy.Schema.EmbedProvider do
@moduledoc """
Discord Embed Provider Object
"""
use Remedy.Schema
@type t :: %__MODULE__{
provider: String.t(),
url: String.t()
}
embedded_schema do
field :provider, :string
field :url, :string
end
def changeset(model \\ %__MODULE__{}, params) do
fields = __MODULE__.__schema__(:fields)
embeds = __MODULE__.__schema__(:embeds)
cast_model = cast(model, params, fields -- embeds)
Enum.reduce(embeds, cast_model, fn embed, cast_model ->
cast_embed(cast_model, embed)
end)
end
end
defmodule Remedy.Schema.EmbedThumbnail do
@moduledoc """
Discord Embed Thumbnail Object
"""
use Remedy.Schema
@type t :: %__MODULE__{
url: String.t(),
proxy_url: String.t(),
height: integer(),
width: integer()
}
embedded_schema do
field :url, :string
field :proxy_url, :string
field :height, :integer
field :width, :integer
end
def changeset(model \\ %__MODULE__{}, params) do
fields = __MODULE__.__schema__(:fields)
embeds = __MODULE__.__schema__(:embeds)
cast_model = cast(model, params, fields -- embeds)
Enum.reduce(embeds, cast_model, fn embed, cast_model ->
cast_embed(cast_model, embed)
end)
end
end
defmodule Remedy.Schema.EmbedVideo do
@moduledoc """
Embed Video Schema.
"""
use Remedy.Schema
@type t :: %__MODULE__{
url: String.t(),
proxy_url: String.t(),
height: integer(),
width: integer()
}
embedded_schema do
field :url, :string
field :proxy_url, :string
field :height, :integer
field :width, :integer
end
@doc false
def changeset(model \\ %__MODULE__{}, params) do
fields = __MODULE__.__schema__(:fields)
embeds = __MODULE__.__schema__(:embeds)
cast_model =
model
|> cast(params, fields -- embeds)
|> validate_required([:name])
|> validate_length(:name, max: 32)
Enum.reduce(embeds, cast_model, fn embed, cast_model ->
cast_embed(cast_model, embed)
end)
end
end