// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/js-self-profiling

///|
/// ProfilerResource typedef
pub type ProfilerResource = String

///|
/// ProfilerTrace dictionary
pub(all) struct ProfilerTrace {
  resources : Array[ProfilerResource]
  frames : Array[ProfilerFrame]
  stacks : Array[ProfilerStack]
  samples : Array[ProfilerSample]
}

///|
/// Create a new ProfilerTrace with default values
pub fn ProfilerTrace::default() -> ProfilerTrace {
  ProfilerTrace::{ resources: [], frames: [], stacks: [], samples: [] }
}

///|
extern "js" fn ProfilerTrace::to_js_ffi(self : ProfilerTrace) -> JsValue =
  #| (self) => ({
  #|   resources: self.resources,
  #|   frames: self.frames,
  #|   stacks: self.stacks,
  #|   samples: self.samples
  #| })

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

///|
extern "js" fn ProfilerTrace::from_js_ffi(value : JsValue) -> ProfilerTrace =
  #| (v) => ({
  #|   resources: v.resources,
  #|   frames: v.frames,
  #|   stacks: v.stacks,
  #|   samples: v.samples
  #| })

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

///|
/// ProfilerSample dictionary
pub(all) struct ProfilerSample {
  timestamp : DOMHighResTimeStamp
  stackId : Int64?
}

///|
/// Create a new ProfilerSample
pub fn ProfilerSample::new(timestamp~ : DOMHighResTimeStamp) -> ProfilerSample {
  ProfilerSample::{ timestamp, stackId: None }
}

///|
extern "js" fn ProfilerSample::to_js_ffi(self : ProfilerSample) -> JsValue =
  #| (self) => ({
  #|   timestamp: self.timestamp,
  #|   stackId: self.stackId
  #| })

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

///|
extern "js" fn ProfilerSample::from_js_ffi(value : JsValue) -> ProfilerSample =
  #| (v) => ({
  #|   timestamp: v.timestamp,
  #|   stackId: v.stackId
  #| })

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

///|
/// ProfilerStack dictionary
pub(all) struct ProfilerStack {
  parentId : Int64?
  frameId : Int64
}

///|
/// Create a new ProfilerStack with default values
pub fn ProfilerStack::default() -> ProfilerStack {
  ProfilerStack::{ parentId: None, frameId: 0 }
}

///|
extern "js" fn ProfilerStack::to_js_ffi(self : ProfilerStack) -> JsValue =
  #| (self) => ({
  #|   parentId: self.parentId,
  #|   frameId: self.frameId
  #| })

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

///|
extern "js" fn ProfilerStack::from_js_ffi(value : JsValue) -> ProfilerStack =
  #| (v) => ({
  #|   parentId: v.parentId,
  #|   frameId: v.frameId
  #| })

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

///|
/// ProfilerFrame dictionary
pub(all) struct ProfilerFrame {
  name : String
  resourceId : Int64?
  line : Int64?
  column : Int64?
}

///|
/// Create a new ProfilerFrame with default values
pub fn ProfilerFrame::default() -> ProfilerFrame {
  ProfilerFrame::{ name: "", resourceId: None, line: None, column: None }
}

///|
extern "js" fn ProfilerFrame::to_js_ffi(self : ProfilerFrame) -> JsValue =
  #| (self) => ({
  #|   name: self.name,
  #|   resourceId: self.resourceId,
  #|   line: self.line,
  #|   column: self.column
  #| })

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

///|
extern "js" fn ProfilerFrame::from_js_ffi(value : JsValue) -> ProfilerFrame =
  #| (v) => ({
  #|   name: v.name,
  #|   resourceId: v.resourceId,
  #|   line: v.line,
  #|   column: v.column
  #| })

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

///|
/// ProfilerInitOptions dictionary
pub(all) struct ProfilerInitOptions {
  sampleInterval : DOMHighResTimeStamp
  maxBufferSize : Int
}

///|
/// Create a new ProfilerInitOptions
pub fn ProfilerInitOptions::new(
  sampleInterval~ : DOMHighResTimeStamp,
) -> ProfilerInitOptions {
  ProfilerInitOptions::{ sampleInterval, maxBufferSize: 0 }
}

///|
extern "js" fn ProfilerInitOptions::to_js_ffi(
  self : ProfilerInitOptions,
) -> JsValue =
  #| (self) => ({
  #|   sampleInterval: self.sampleInterval,
  #|   maxBufferSize: self.maxBufferSize
  #| })

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

///|
extern "js" fn ProfilerInitOptions::from_js_ffi(
  value : JsValue,
) -> ProfilerInitOptions =
  #| (v) => ({
  #|   sampleInterval: v.sampleInterval,
  #|   maxBufferSize: v.maxBufferSize
  #| })

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

///|
/// Profiler interface
pub type Profiler

///|
pub extern "js" fn Profiler::to_js_value(self : Profiler) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to Profiler (unchecked)
pub extern "js" fn Profiler::from_js_value(v : JsValue) -> Profiler =
  #| (v) => v

///|
/// Safely cast JsValue to Profiler (checked with instanceof)
pub extern "js" fn Profiler::from_js_value_opt(v : JsValue) -> Profiler? =
  #| (v) => (v instanceof Profiler) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to Profiler (checked with instanceof)
pub extern "js" fn JsValue::as_profiler(self : JsValue) -> Profiler? =
  #| (self) => (self instanceof Profiler) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to Profiler (unchecked)
pub extern "js" fn JsValue::to_profiler(self : JsValue) -> Profiler =
  #| (self) => self

///|
pub extern "js" fn Profiler::to_event_target(self : Profiler) -> EventTarget =
  #| (self) => self

///|
/// Error type for throwing methods
pub(all) enum ProfilerConstructorError {
  RangeError(JsError)
  NotAllowedError(JsError)
  OtherError(JsError)
} derive(Show)

///|
pub extern "js" fn Profiler::get_sample_interval(
  self : Profiler,
) -> DOMHighResTimeStamp =
  #| (self) => self.sampleInterval

///|
pub extern "js" fn Profiler::get_stopped(self : Profiler) -> Bool =
  #| (self) => self.stopped

///|
extern "js" fn Profiler::new_ffi(
  options : JsValue,
) -> Result[Profiler, ProfilerConstructorError] =
  #| (options) => (() => { try { return { $tag: 1, _0: new Profiler(options) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'RangeError') return { $tag: 0, _0: e }; if (n === 'NotAllowedError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub fn Profiler::new(
  options : ProfilerInitOptions,
) -> Result[Profiler, ProfilerConstructorError] {
  Profiler::new_ffi(options.to_js())
}

///|
pub extern "js" fn Profiler::stop(self : Profiler) -> Promise[ProfilerTrace] =
  #| (self) => self.stop().then(v => ({
  #|   resources: v.resources,
  #|   frames: v.frames,
  #|   stacks: v.stacks,
  #|   samples: v.samples
  #| }))