Current section
Files
Jump to
Current section
Files
lib/models/request/trades/update_trade.ex
defmodule ExOanda.Request.UpdateTrade do
@moduledoc """
Schema for Oanda trade update request.
[Oanda Docs](https://developer.oanda.com/rest-live-v20/trade-ep/)
"""
use TypedEctoSchema
import Ecto.Changeset
@primary_key false
typed_embedded_schema do
embeds_one :take_profit, ExOanda.TakeProfitDetails
embeds_one :stop_loss, ExOanda.StopLossDetails
embeds_one :trailing_stop_loss, ExOanda.TrailingStopLossDetails
embeds_one :guaranteed_stop_loss, ExOanda.GuaranteedStopLossDetails
end
@doc false
def changeset(struct, params) do
struct
|> cast(params, [])
|> cast_embed(:take_profit)
|> cast_embed(:stop_loss)
|> cast_embed(:trailing_stop_loss)
|> cast_embed(:guaranteed_stop_loss)
|> validate_required_one_of([:take_profit, :stop_loss, :trailing_stop_loss, :guaranteed_stop_loss])
end
defp validate_required_one_of(changeset, fields) do
case Enum.any?(fields, fn field -> get_field(changeset, field) != nil end) do
true -> changeset
false -> add_error(changeset, hd(fields), "at least one of #{inspect(fields)} must be present")
end
end
end