// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/webcodecs-opus-codec-registration

///|
/// OpusBitstreamFormat enum
pub(all) enum OpusBitstreamFormat {
  Opus
  Ogg
} derive(Eq, Show)

///|
/// Convert to string value
pub fn OpusBitstreamFormat::to_string(self : OpusBitstreamFormat) -> String {
  match self {
    OpusBitstreamFormat::Opus => "opus"
    OpusBitstreamFormat::Ogg => "ogg"
  }
}

///|
/// Parse from string value
pub fn OpusBitstreamFormat::from_string(s : String) -> OpusBitstreamFormat? {
  match s {
    "opus" => Some(OpusBitstreamFormat::Opus)
    "ogg" => Some(OpusBitstreamFormat::Ogg)
    _ => None
  }
}

///|
/// OpusSignal enum
pub(all) enum OpusSignal {
  Auto
  Music
  Voice
} derive(Eq, Show)

///|
/// Convert to string value
pub fn OpusSignal::to_string(self : OpusSignal) -> String {
  match self {
    OpusSignal::Auto => "auto"
    OpusSignal::Music => "music"
    OpusSignal::Voice => "voice"
  }
}

///|
/// Parse from string value
pub fn OpusSignal::from_string(s : String) -> OpusSignal? {
  match s {
    "auto" => Some(OpusSignal::Auto)
    "music" => Some(OpusSignal::Music)
    "voice" => Some(OpusSignal::Voice)
    _ => None
  }
}

///|
/// OpusApplication enum
pub(all) enum OpusApplication {
  Voip
  Audio
  Lowdelay
} derive(Eq, Show)

///|
/// Convert to string value
pub fn OpusApplication::to_string(self : OpusApplication) -> String {
  match self {
    OpusApplication::Voip => "voip"
    OpusApplication::Audio => "audio"
    OpusApplication::Lowdelay => "lowdelay"
  }
}

///|
/// Parse from string value
pub fn OpusApplication::from_string(s : String) -> OpusApplication? {
  match s {
    "voip" => Some(OpusApplication::Voip)
    "audio" => Some(OpusApplication::Audio)
    "lowdelay" => Some(OpusApplication::Lowdelay)
    _ => None
  }
}

///|
/// OpusEncoderConfig dictionary
pub(all) struct OpusEncoderConfig {
  format : OpusBitstreamFormat?
  signal : OpusSignal?
  application : OpusApplication?
  frameDuration : Int64?
  complexity : Int?
  packetlossperc : Int?
  useinbandfec : Bool?
  usedtx : Bool?
}

///|
/// Create a new OpusEncoderConfig with default values
pub fn OpusEncoderConfig::default() -> OpusEncoderConfig {
  OpusEncoderConfig::{
    format: None,
    signal: None,
    application: None,
    frameDuration: None,
    complexity: None,
    packetlossperc: None,
    useinbandfec: None,
    usedtx: None,
  }
}

///|
extern "js" fn OpusEncoderConfig::to_js_ffi(
  self : OpusEncoderConfig,
) -> JsValue =
  #| (self) => ({
  #|   format: ((() => { const v = self.format; if (v === undefined) return undefined; return ['opus', 'ogg'][v]; })()),
  #|   signal: ((() => { const v = self.signal; if (v === undefined) return undefined; return ['auto', 'music', 'voice'][v]; })()),
  #|   application: ((() => { const v = self.application; if (v === undefined) return undefined; return ['voip', 'audio', 'lowdelay'][v]; })()),
  #|   frameDuration: self.frameDuration,
  #|   complexity: self.complexity,
  #|   packetlossperc: self.packetlossperc,
  #|   useinbandfec: (self.useinbandfec === -1 ? undefined : self.useinbandfec),
  #|   usedtx: (self.usedtx === -1 ? undefined : self.usedtx)
  #| })

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

///|
extern "js" fn OpusEncoderConfig::from_js_ffi(
  value : JsValue,
) -> OpusEncoderConfig =
  #| (v) => ({
  #|   format: (v.format === undefined ? undefined : ['opus', 'ogg'].indexOf(v.format)),
  #|   signal: (v.signal === undefined ? undefined : ['auto', 'music', 'voice'].indexOf(v.signal)),
  #|   application: (v.application === undefined ? undefined : ['voip', 'audio', 'lowdelay'].indexOf(v.application)),
  #|   frameDuration: v.frameDuration,
  #|   complexity: v.complexity,
  #|   packetlossperc: v.packetlossperc,
  #|   useinbandfec: (v.useinbandfec === undefined ? -1 : v.useinbandfec),
  #|   usedtx: (v.usedtx === undefined ? -1 : v.usedtx)
  #| })

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