// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/ua-client-hints

///|
/// NavigatorUABrandVersion dictionary
pub(all) struct NavigatorUABrandVersion {
  brand : String?
  version : String?
}

///|
/// Create a new NavigatorUABrandVersion with default values
pub fn NavigatorUABrandVersion::default() -> NavigatorUABrandVersion {
  NavigatorUABrandVersion::{ brand: None, version: None }
}

///|
extern "js" fn NavigatorUABrandVersion::to_js_ffi(
  self : NavigatorUABrandVersion,
) -> JsValue =
  #| (self) => ({
  #|   brand: self.brand,
  #|   version: self.version
  #| })

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

///|
extern "js" fn NavigatorUABrandVersion::from_js_ffi(
  value : JsValue,
) -> NavigatorUABrandVersion =
  #| (v) => ({
  #|   brand: v.brand,
  #|   version: v.version
  #| })

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

///|
/// UADataValues dictionary
pub(all) struct UADataValues {
  architecture : String?
  bitness : String?
  brands : Array[NavigatorUABrandVersion]?
  formFactors : Array[String]?
  fullVersionList : Array[NavigatorUABrandVersion]?
  model : String?
  mobile : Bool?
  platform : String?
  platformVersion : String?
  uaFullVersion : String?
  wow64 : Bool?
}

///|
/// Create a new UADataValues with default values
pub fn UADataValues::default() -> UADataValues {
  UADataValues::{
    architecture: None,
    bitness: None,
    brands: None,
    formFactors: None,
    fullVersionList: None,
    model: None,
    mobile: None,
    platform: None,
    platformVersion: None,
    uaFullVersion: None,
    wow64: None,
  }
}

///|
extern "js" fn UADataValues::to_js_ffi(self : UADataValues) -> JsValue =
  #| (self) => ({
  #|   architecture: self.architecture,
  #|   bitness: self.bitness,
  #|   brands: ((() => { const v = self.brands; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   formFactors: ((() => { const v = self.formFactors; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   fullVersionList: ((() => { const v = self.fullVersionList; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   model: self.model,
  #|   mobile: (self.mobile === -1 ? undefined : self.mobile),
  #|   platform: self.platform,
  #|   platformVersion: self.platformVersion,
  #|   uaFullVersion: self.uaFullVersion,
  #|   wow64: (self.wow64 === -1 ? undefined : self.wow64)
  #| })

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

///|
extern "js" fn UADataValues::from_js_ffi(value : JsValue) -> UADataValues =
  #| (v) => ({
  #|   architecture: v.architecture,
  #|   bitness: v.bitness,
  #|   brands: (v.brands === undefined ? { $tag: 0 } : { $tag: 1, _0: v.brands }),
  #|   formFactors: (v.formFactors === undefined ? { $tag: 0 } : { $tag: 1, _0: v.formFactors }),
  #|   fullVersionList: (v.fullVersionList === undefined ? { $tag: 0 } : { $tag: 1, _0: v.fullVersionList }),
  #|   model: v.model,
  #|   mobile: (v.mobile === undefined ? -1 : v.mobile),
  #|   platform: v.platform,
  #|   platformVersion: v.platformVersion,
  #|   uaFullVersion: v.uaFullVersion,
  #|   wow64: (v.wow64 === undefined ? -1 : v.wow64)
  #| })

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

///|
/// UALowEntropyJSON dictionary
pub(all) struct UALowEntropyJSON {
  brands : Array[NavigatorUABrandVersion]?
  mobile : Bool?
  platform : String?
}

///|
/// Create a new UALowEntropyJSON with default values
pub fn UALowEntropyJSON::default() -> UALowEntropyJSON {
  UALowEntropyJSON::{ brands: None, mobile: None, platform: None }
}

///|
extern "js" fn UALowEntropyJSON::to_js_ffi(self : UALowEntropyJSON) -> JsValue =
  #| (self) => ({
  #|   brands: ((() => { const v = self.brands; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   mobile: (self.mobile === -1 ? undefined : self.mobile),
  #|   platform: self.platform
  #| })

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

///|
extern "js" fn UALowEntropyJSON::from_js_ffi(
  value : JsValue,
) -> UALowEntropyJSON =
  #| (v) => ({
  #|   brands: (v.brands === undefined ? { $tag: 0 } : { $tag: 1, _0: v.brands }),
  #|   mobile: (v.mobile === undefined ? -1 : v.mobile),
  #|   platform: v.platform
  #| })

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

///|
/// NavigatorUAData interface
pub type NavigatorUAData

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

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

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

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

///|
/// Cast JsValue to NavigatorUAData (unchecked)
pub extern "js" fn JsValue::to_navigator_ua_data(
  self : JsValue,
) -> NavigatorUAData =
  #| (self) => self

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

///|
pub extern "js" fn NavigatorUAData::get_brands(
  self : NavigatorUAData,
) -> Array[NavigatorUABrandVersion] =
  #| (self) => self.brands

///|
pub extern "js" fn NavigatorUAData::get_mobile(self : NavigatorUAData) -> Bool =
  #| (self) => self.mobile

///|
pub extern "js" fn NavigatorUAData::get_platform(
  self : NavigatorUAData,
) -> String =
  #| (self) => self.platform

///|
pub extern "js" fn NavigatorUAData::get_high_entropy_values(
  self : NavigatorUAData,
  hints : Array[String],
) -> Promise[Result[UADataValues, NavigatorUADataGetHighEntropyValuesError]] =
  #| (self, hints) => self.getHighEntropyValues(hints).then(v => ({
  #|   architecture: v.architecture,
  #|   bitness: v.bitness,
  #|   brands: (v.brands === undefined ? { $tag: 0 } : { $tag: 1, _0: v.brands }),
  #|   formFactors: (v.formFactors === undefined ? { $tag: 0 } : { $tag: 1, _0: v.formFactors }),
  #|   fullVersionList: (v.fullVersionList === undefined ? { $tag: 0 } : { $tag: 1, _0: v.fullVersionList }),
  #|   model: v.model,
  #|   mobile: (v.mobile === undefined ? -1 : v.mobile),
  #|   platform: v.platform,
  #|   platformVersion: v.platformVersion,
  #|   uaFullVersion: v.uaFullVersion,
  #|   wow64: (v.wow64 === undefined ? -1 : v.wow64)
  #| })).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'NotAllowedError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }))

///|
pub extern "js" fn NavigatorUAData::to_json(
  self : NavigatorUAData,
) -> UALowEntropyJSON =
  #| (self) => self.toJSON()