Current section
Files
Jump to
Current section
Files
lib/models/request/orders/create_order.ex
defmodule ExOanda.Request.CreateOrder do
@moduledoc """
Schema for Oanda order create request.
[Oanda Docs](https://developer.oanda.com/rest-live-v20/order-ep/)
"""
use Ecto.Schema
import Ecto.Changeset
import PolymorphicEmbed
alias ExOanda.{
GuaranteedStopLossOrderRequest,
LimitOrderRequest,
MarketIfTouchedOrderRequest,
MarketOrderRequest,
StopLossOrderRequest,
StopOrderRequest,
TakeProfitOrderRequest,
TrailingStopLossOrderRequest
}
@primary_key false
@type t :: %__MODULE__{
order: order_request()
}
@type order_request ::
MarketOrderRequest.t()
| LimitOrderRequest.t()
| StopOrderRequest.t()
| MarketIfTouchedOrderRequest.t()
| TakeProfitOrderRequest.t()
| StopLossOrderRequest.t()
| GuaranteedStopLossOrderRequest.t()
| TrailingStopLossOrderRequest.t()
embedded_schema do
polymorphic_embeds_one(:order,
types: [
MARKET: MarketOrderRequest,
LIMIT: LimitOrderRequest,
STOP: StopOrderRequest,
MARKET_IF_TOUCHED: MarketIfTouchedOrderRequest,
TAKE_PROFIT: TakeProfitOrderRequest,
STOP_LOSS: StopLossOrderRequest,
GUARANTEED_STOP_LOSS: GuaranteedStopLossOrderRequest,
TRAILING_STOP_LOSS: TrailingStopLossOrderRequest
],
type_field_name: :type,
on_type_not_found: :changeset_error,
on_replace: :update
)
end
@doc false
def changeset(struct, params) do
struct
|> cast(params, [])
|> cast_polymorphic_embed(:order)
|> validate_required([:order])
end
end