// Generated by scripts/generate.mjs from bindings/api.mjs. Do not edit.

///|
#external
pub type KeyframeTrack

///|
pub extern "js" fn KeyframeTrack::name(self : KeyframeTrack) -> String =
  #| (self) => self.name

///|
pub extern "js" fn KeyframeTrack::shift(
  self : KeyframeTrack,
  offset : Double,
) -> KeyframeTrack =
  #| (self, offset) => self.shift(offset)

///|
pub extern "js" fn KeyframeTrack::scale(
  self : KeyframeTrack,
  scale : Double,
) -> KeyframeTrack =
  #| (self, scale) => self.scale(scale)

///|
pub extern "js" fn KeyframeTrack::times(
  self : KeyframeTrack,
) -> FixedArray[Double] =
  #| (self) => Array.from(self.times)

///|
extern "js" fn KeyframeTrack::ffi_number_values(
  self : KeyframeTrack,
) -> Nullable[FixedArray[Double]] =
  #| (self) => { const values = Array.from(self.values); return values.every(value => typeof value === "number") ? values : null; }

///|
pub fn KeyframeTrack::number_values(
  self : KeyframeTrack,
) -> FixedArray[Double]? {
  self.ffi_number_values().to_option()
}

///|
pub extern "js" fn KeyframeTrack::set_interpolation(
  self : KeyframeTrack,
  interpolation : InterpolationMode,
) -> KeyframeTrack =
  #| (self, interpolation) => self.setInterpolation(interpolation)

///|
pub extern "js" fn KeyframeTrack::get_interpolation(
  self : KeyframeTrack,
) -> InterpolationMode =
  #| (self) => self.getInterpolation()

///|
pub extern "js" fn KeyframeTrack::get_value_size(self : KeyframeTrack) -> Int =
  #| (self) => self.getValueSize()

///|
pub extern "js" fn KeyframeTrack::trim(
  self : KeyframeTrack,
  start_time : Double,
  end_time : Double,
) -> KeyframeTrack =
  #| (self, start_time, end_time) => self.trim(start_time, end_time)

///|
pub extern "js" fn KeyframeTrack::validate(self : KeyframeTrack) -> Bool =
  #| (self) => self.validate()

///|
pub extern "js" fn KeyframeTrack::optimize(
  self : KeyframeTrack,
) -> KeyframeTrack =
  #| (self) => self.optimize()

///|
pub extern "js" fn KeyframeTrack::clone(self : KeyframeTrack) -> KeyframeTrack =
  #| (self) => self.clone()

///|
pub extern "js" fn KeyframeTrack::value_type_name(
  self : KeyframeTrack,
) -> String =
  #| (self) => self.ValueTypeName

///|
pub extern "js" fn KeyframeTrack::default_interpolation(
  self : KeyframeTrack,
) -> InterpolationMode =
  #| (self) => self.DefaultInterpolation

///|
extern "js" fn KeyframeTrack::ffi_create_numeric_interpolant(
  self : KeyframeTrack,
) -> Nullable[Interpolant] =
  #| (self) => Array.from(self.values).every(value => typeof value === "number") ? self.createInterpolant() : null

///|
pub fn KeyframeTrack::create_numeric_interpolant(
  self : KeyframeTrack,
) -> Interpolant? {
  self.ffi_create_numeric_interpolant().to_option()
}

///|
extern "js" fn KeyframeTrack::ffi_to_json(
  self : KeyframeTrack,
) -> JsResult[String] =
  #| (self) => { try { return { ok: true, value: (() => JSON.stringify(self.constructor.toJSON(self)))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn KeyframeTrack::to_json(
  self : KeyframeTrack,
) -> Json raise SerializationError {
  match self.ffi_to_json().into_result() {
    Ok(value) =>
      @json.parse(value) catch {
        error => raise SerializationError((error : Error).to_string())
      }
    Err(message) => raise SerializationError(message)
  }
}

///|
extern "js" fn KeyframeTrack::ffi_to_json_string(
  self : KeyframeTrack,
) -> JsResult[String] =
  #| (self) => { try { return { ok: true, value: (() => JSON.stringify(self.constructor.toJSON(self)))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn KeyframeTrack::to_json_string(
  self : KeyframeTrack,
) -> String raise SerializationError {
  match self.ffi_to_json_string().into_result() {
    Ok(value) => value
    Err(message) => raise SerializationError(message)
  }
}