// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/webrtc-priority

///|
/// RTCPriorityType enum
pub(all) enum RTCPriorityType {
  VeryLow
  Low
  Medium
  High
} derive(Eq, Show)

///|
/// Convert to string value
pub fn RTCPriorityType::to_string(self : RTCPriorityType) -> String {
  match self {
    RTCPriorityType::VeryLow => "very-low"
    RTCPriorityType::Low => "low"
    RTCPriorityType::Medium => "medium"
    RTCPriorityType::High => "high"
  }
}

///|
/// Parse from string value
pub fn RTCPriorityType::from_string(s : String) -> RTCPriorityType? {
  match s {
    "very-low" => Some(RTCPriorityType::VeryLow)
    "low" => Some(RTCPriorityType::Low)
    "medium" => Some(RTCPriorityType::Medium)
    "high" => Some(RTCPriorityType::High)
    _ => None
  }
}

///|
/// RTCRtpEncodingParameters dictionary
pub(all) struct RTCRtpEncodingParameters {
  priority : RTCPriorityType?
  networkPriority : RTCPriorityType?
  scalabilityMode : String?
  active : Bool?
  codec : RTCRtpCodec?
  maxBitrate : Int?
  maxFramerate : Double?
  scaleResolutionDownBy : Double?
}

///|
/// Create a new RTCRtpEncodingParameters with default values
pub fn RTCRtpEncodingParameters::default() -> RTCRtpEncodingParameters {
  RTCRtpEncodingParameters::{
    priority: None,
    networkPriority: None,
    scalabilityMode: None,
    active: None,
    codec: None,
    maxBitrate: None,
    maxFramerate: None,
    scaleResolutionDownBy: None,
  }
}

///|
extern "js" fn RTCRtpEncodingParameters::to_js_ffi(
  self : RTCRtpEncodingParameters,
) -> JsValue =
  #| (self) => ({
  #|   priority: ((() => { const v = self.priority; if (v === undefined) return undefined; return ['very-low', 'low', 'medium', 'high'][v]; })()),
  #|   networkPriority: ((() => { const v = self.networkPriority; if (v === undefined) return undefined; return ['very-low', 'low', 'medium', 'high'][v]; })()),
  #|   scalabilityMode: self.scalabilityMode,
  #|   active: (self.active === -1 ? undefined : self.active),
  #|   codec: ((() => { const v = self.codec; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   maxBitrate: self.maxBitrate,
  #|   maxFramerate: ((() => { const v = self.maxFramerate; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   scaleResolutionDownBy: ((() => { const v = self.scaleResolutionDownBy; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn RTCRtpEncodingParameters::to_js(
  self : RTCRtpEncodingParameters,
) -> JsValue {
  RTCRtpEncodingParameters::to_js_ffi(self)
}

///|
extern "js" fn RTCRtpEncodingParameters::from_js_ffi(
  value : JsValue,
) -> RTCRtpEncodingParameters =
  #| (v) => ({
  #|   priority: (v.priority === undefined ? undefined : ['very-low', 'low', 'medium', 'high'].indexOf(v.priority)),
  #|   networkPriority: (v.networkPriority === undefined ? undefined : ['very-low', 'low', 'medium', 'high'].indexOf(v.networkPriority)),
  #|   scalabilityMode: v.scalabilityMode,
  #|   active: (v.active === undefined ? -1 : v.active),
  #|   codec: (v.codec === undefined ? { $tag: 0 } : { $tag: 1, _0: v.codec }),
  #|   maxBitrate: v.maxBitrate,
  #|   maxFramerate: (v.maxFramerate === undefined ? { $tag: 0 } : { $tag: 1, _0: v.maxFramerate }),
  #|   scaleResolutionDownBy: (v.scaleResolutionDownBy === undefined ? { $tag: 0 } : { $tag: 1, _0: v.scaleResolutionDownBy })
  #| })

///|
/// Convert from JsValue
pub fn RTCRtpEncodingParameters::from_js(
  value : JsValue,
) -> RTCRtpEncodingParameters {
  RTCRtpEncodingParameters::from_js_ffi(value)
}

///|
/// RTCDataChannelInit dictionary
pub(all) struct RTCDataChannelInit {
  priority : RTCPriorityType?
  ordered : Bool?
  maxPacketLifeTime : Int?
  maxRetransmits : Int?
  protocol : String?
  negotiated : Bool?
  id : Int?
}

///|
/// Create a new RTCDataChannelInit with default values
pub fn RTCDataChannelInit::default() -> RTCDataChannelInit {
  RTCDataChannelInit::{
    priority: None,
    ordered: None,
    maxPacketLifeTime: None,
    maxRetransmits: None,
    protocol: None,
    negotiated: None,
    id: None,
  }
}

///|
extern "js" fn RTCDataChannelInit::to_js_ffi(
  self : RTCDataChannelInit,
) -> JsValue =
  #| (self) => ({
  #|   priority: ((() => { const v = self.priority; if (v === undefined) return undefined; return ['very-low', 'low', 'medium', 'high'][v]; })()),
  #|   ordered: (self.ordered === -1 ? undefined : self.ordered),
  #|   maxPacketLifeTime: self.maxPacketLifeTime,
  #|   maxRetransmits: self.maxRetransmits,
  #|   protocol: self.protocol,
  #|   negotiated: (self.negotiated === -1 ? undefined : self.negotiated),
  #|   id: self.id
  #| })

///|
/// Convert to JsValue
pub fn RTCDataChannelInit::to_js(self : RTCDataChannelInit) -> JsValue {
  RTCDataChannelInit::to_js_ffi(self)
}

///|
extern "js" fn RTCDataChannelInit::from_js_ffi(
  value : JsValue,
) -> RTCDataChannelInit =
  #| (v) => ({
  #|   priority: (v.priority === undefined ? undefined : ['very-low', 'low', 'medium', 'high'].indexOf(v.priority)),
  #|   ordered: (v.ordered === undefined ? -1 : v.ordered),
  #|   maxPacketLifeTime: v.maxPacketLifeTime,
  #|   maxRetransmits: v.maxRetransmits,
  #|   protocol: v.protocol,
  #|   negotiated: (v.negotiated === undefined ? -1 : v.negotiated),
  #|   id: v.id
  #| })

///|
/// Convert from JsValue
pub fn RTCDataChannelInit::from_js(value : JsValue) -> RTCDataChannelInit {
  RTCDataChannelInit::from_js_ffi(value)
}