// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/credential-management

///|
/// PasswordCredentialInit typedef
pub type PasswordCredentialInit

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

///|
/// Create PasswordCredentialInit from PasswordCredentialData
pub extern "js" fn PasswordCredentialInit::from_password_credential_data(
  v : PasswordCredentialData,
) -> PasswordCredentialInit =
  #| (v) => v

///|
/// Create PasswordCredentialInit from HTMLFormElement
pub extern "js" fn PasswordCredentialInit::from_html_form_element(
  v : HTMLFormElement,
) -> PasswordCredentialInit =
  #| (v) => v

///|
/// Check if this PasswordCredentialInit is PasswordCredentialData
pub extern "js" fn PasswordCredentialInit::is_password_credential_data(
  self : PasswordCredentialInit,
) -> Bool =
  #| (self) => typeof self === 'object' && self !== null

///|
/// Check if this PasswordCredentialInit is HTMLFormElement
pub extern "js" fn PasswordCredentialInit::is_html_form_element(
  self : PasswordCredentialInit,
) -> Bool =
  #| (self) => self instanceof HTMLFormElement

///|
/// Try to get PasswordCredentialInit as PasswordCredentialData
pub extern "js" fn PasswordCredentialInit::as_password_credential_data(
  self : PasswordCredentialInit,
) -> PasswordCredentialData? =
  #| (self) => (typeof self === 'object' && self !== null) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Try to get PasswordCredentialInit as HTMLFormElement
pub extern "js" fn PasswordCredentialInit::as_html_form_element(
  self : PasswordCredentialInit,
) -> HTMLFormElement? =
  #| (self) => (self instanceof HTMLFormElement) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Flatten Option[PasswordCredentialInit] to PasswordCredentialData?
pub fn PasswordCredentialInit::bind_as_password_credential_data(
  value : PasswordCredentialInit?,
) -> PasswordCredentialData? {
  match value {
    Some(v) => v.as_password_credential_data()
    None => None
  }
}

///|
/// Flatten Option[PasswordCredentialInit] to HTMLFormElement?
pub fn PasswordCredentialInit::bind_as_html_form_element(
  value : PasswordCredentialInit?,
) -> HTMLFormElement? {
  match value {
    Some(v) => v.as_html_form_element()
    None => None
  }
}

///|
/// CredentialMediationRequirement enum
pub(all) enum CredentialMediationRequirement {
  Silent
  Optional
  Conditional
  Required
} derive(Eq, Show)

///|
/// Convert to string value
pub fn CredentialMediationRequirement::to_string(
  self : CredentialMediationRequirement,
) -> String {
  match self {
    CredentialMediationRequirement::Silent => "silent"
    CredentialMediationRequirement::Optional => "optional"
    CredentialMediationRequirement::Conditional => "conditional"
    CredentialMediationRequirement::Required => "required"
  }
}

///|
/// Parse from string value
pub fn CredentialMediationRequirement::from_string(
  s : String,
) -> CredentialMediationRequirement? {
  match s {
    "silent" => Some(CredentialMediationRequirement::Silent)
    "optional" => Some(CredentialMediationRequirement::Optional)
    "conditional" => Some(CredentialMediationRequirement::Conditional)
    "required" => Some(CredentialMediationRequirement::Required)
    _ => None
  }
}

///|
/// CredentialData dictionary
pub(all) struct CredentialData {
  id : String
}

///|
/// Create a new CredentialData with default values
pub fn CredentialData::default() -> CredentialData {
  CredentialData::{ id: "" }
}

///|
extern "js" fn CredentialData::to_js_ffi(self : CredentialData) -> JsValue =
  #| (self) => ({
  #|   id: self.id
  #| })

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

///|
extern "js" fn CredentialData::from_js_ffi(value : JsValue) -> CredentialData =
  #| (v) => ({
  #|   id: v.id
  #| })

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

///|
/// CredentialRequestOptions dictionary
pub(all) struct CredentialRequestOptions {
  mediation : CredentialMediationRequirement?
  signal : AbortSignal?
  password : Bool?
  federated : FederatedCredentialRequestOptions?
  digital : DigitalCredentialRequestOptions?
  identity : IdentityCredentialRequestOptions?
  otp : OTPCredentialRequestOptions?
  publicKey : PublicKeyCredentialRequestOptions?
}

///|
/// Create a new CredentialRequestOptions with default values
pub fn CredentialRequestOptions::default() -> CredentialRequestOptions {
  CredentialRequestOptions::{
    mediation: None,
    signal: None,
    password: None,
    federated: None,
    digital: None,
    identity: None,
    otp: None,
    publicKey: None,
  }
}

///|
extern "js" fn CredentialRequestOptions::to_js_ffi(
  self : CredentialRequestOptions,
) -> JsValue =
  #| (self) => ({
  #|   mediation: ((() => { const v = self.mediation; if (v === undefined) return undefined; return ['silent', 'optional', 'conditional', 'required'][v]; })()),
  #|   signal: ((() => { const v = self.signal; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   password: (self.password === -1 ? undefined : self.password),
  #|   federated: ((() => { const v = self.federated; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   digital: ((() => { const v = self.digital; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   identity: ((() => { const v = self.identity; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   otp: ((() => { const v = self.otp; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   publicKey: ((() => { const v = self.publicKey; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

///|
extern "js" fn CredentialRequestOptions::from_js_ffi(
  value : JsValue,
) -> CredentialRequestOptions =
  #| (v) => ({
  #|   mediation: (v.mediation === undefined ? undefined : ['silent', 'optional', 'conditional', 'required'].indexOf(v.mediation)),
  #|   signal: (v.signal === undefined ? { $tag: 0 } : { $tag: 1, _0: v.signal }),
  #|   password: (v.password === undefined ? -1 : v.password),
  #|   federated: (v.federated === undefined ? { $tag: 0 } : { $tag: 1, _0: v.federated }),
  #|   digital: (v.digital === undefined ? { $tag: 0 } : { $tag: 1, _0: v.digital }),
  #|   identity: (v.identity === undefined ? { $tag: 0 } : { $tag: 1, _0: v.identity }),
  #|   otp: (v.otp === undefined ? { $tag: 0 } : { $tag: 1, _0: v.otp }),
  #|   publicKey: (v.publicKey === undefined ? { $tag: 0 } : { $tag: 1, _0: v.publicKey })
  #| })

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

///|
/// CredentialCreationOptions dictionary
pub(all) struct CredentialCreationOptions {
  mediation : CredentialMediationRequirement?
  signal : AbortSignal?
  password : PasswordCredentialInit?
  federated : FederatedCredentialInit?
  digital : DigitalCredentialCreationOptions?
  publicKey : PublicKeyCredentialCreationOptions?
}

///|
/// Create a new CredentialCreationOptions with default values
pub fn CredentialCreationOptions::default() -> CredentialCreationOptions {
  CredentialCreationOptions::{
    mediation: None,
    signal: None,
    password: None,
    federated: None,
    digital: None,
    publicKey: None,
  }
}

///|
extern "js" fn CredentialCreationOptions::to_js_ffi(
  self : CredentialCreationOptions,
) -> JsValue =
  #| (self) => ({
  #|   mediation: ((() => { const v = self.mediation; if (v === undefined) return undefined; return ['silent', 'optional', 'conditional', 'required'][v]; })()),
  #|   signal: ((() => { const v = self.signal; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   password: ((() => { const v = self.password; if (v === undefined || v.$tag !== 1) return undefined; return v._0.to_js_value(); })()),
  #|   federated: ((() => { const v = self.federated; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   digital: ((() => { const v = self.digital; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   publicKey: ((() => { const v = self.publicKey; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

///|
extern "js" fn CredentialCreationOptions::from_js_ffi(
  value : JsValue,
) -> CredentialCreationOptions =
  #| (v) => ({
  #|   mediation: (v.mediation === undefined ? undefined : ['silent', 'optional', 'conditional', 'required'].indexOf(v.mediation)),
  #|   signal: (v.signal === undefined ? { $tag: 0 } : { $tag: 1, _0: v.signal }),
  #|   password: (v.password === undefined ? { $tag: 0 } : { $tag: 1, _0: v.password }),
  #|   federated: (v.federated === undefined ? { $tag: 0 } : { $tag: 1, _0: v.federated }),
  #|   digital: (v.digital === undefined ? { $tag: 0 } : { $tag: 1, _0: v.digital }),
  #|   publicKey: (v.publicKey === undefined ? { $tag: 0 } : { $tag: 1, _0: v.publicKey })
  #| })

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

///|
/// PasswordCredentialData dictionary
pub(all) struct PasswordCredentialData {
  id : String
  name : String?
  iconURL : String?
  origin : String
  password : String
}

///|
/// Create a new PasswordCredentialData with default values
pub fn PasswordCredentialData::default() -> PasswordCredentialData {
  PasswordCredentialData::{
    id: "",
    name: None,
    iconURL: None,
    origin: "",
    password: "",
  }
}

///|
extern "js" fn PasswordCredentialData::to_js_ffi(
  self : PasswordCredentialData,
) -> JsValue =
  #| (self) => ({
  #|   id: self.id,
  #|   name: self.name,
  #|   iconURL: self.iconURL,
  #|   origin: self.origin,
  #|   password: self.password
  #| })

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

///|
extern "js" fn PasswordCredentialData::from_js_ffi(
  value : JsValue,
) -> PasswordCredentialData =
  #| (v) => ({
  #|   id: v.id,
  #|   name: v.name,
  #|   iconURL: v.iconURL,
  #|   origin: v.origin,
  #|   password: v.password
  #| })

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

///|
/// FederatedCredentialRequestOptions dictionary
pub(all) struct FederatedCredentialRequestOptions {
  providers : Array[String]?
  protocols : Array[String]?
}

///|
/// Create a new FederatedCredentialRequestOptions with default values
pub fn FederatedCredentialRequestOptions::default() -> FederatedCredentialRequestOptions {
  FederatedCredentialRequestOptions::{ providers: None, protocols: None }
}

///|
extern "js" fn FederatedCredentialRequestOptions::to_js_ffi(
  self : FederatedCredentialRequestOptions,
) -> JsValue =
  #| (self) => ({
  #|   providers: ((() => { const v = self.providers; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   protocols: ((() => { const v = self.protocols; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

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

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

///|
/// FederatedCredentialInit dictionary
pub(all) struct FederatedCredentialInit {
  id : String
  name : String?
  iconURL : String?
  origin : String
  provider : String
  protocol : String?
}

///|
/// Create a new FederatedCredentialInit with default values
pub fn FederatedCredentialInit::default() -> FederatedCredentialInit {
  FederatedCredentialInit::{
    id: "",
    name: None,
    iconURL: None,
    origin: "",
    provider: "",
    protocol: None,
  }
}

///|
extern "js" fn FederatedCredentialInit::to_js_ffi(
  self : FederatedCredentialInit,
) -> JsValue =
  #| (self) => ({
  #|   id: self.id,
  #|   name: self.name,
  #|   iconURL: self.iconURL,
  #|   origin: self.origin,
  #|   provider: self.provider,
  #|   protocol: self.protocol
  #| })

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

///|
extern "js" fn FederatedCredentialInit::from_js_ffi(
  value : JsValue,
) -> FederatedCredentialInit =
  #| (v) => ({
  #|   id: v.id,
  #|   name: v.name,
  #|   iconURL: v.iconURL,
  #|   origin: v.origin,
  #|   provider: v.provider,
  #|   protocol: v.protocol
  #| })

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

///|
/// Credential interface
pub type Credential

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

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

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

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

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

///|
pub extern "js" fn Credential::as_password_credential(
  self : Credential,
) -> PasswordCredential? =
  #| (self) => (self instanceof PasswordCredential) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn Credential::as_federated_credential(
  self : Credential,
) -> FederatedCredential? =
  #| (self) => (self instanceof FederatedCredential) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn Credential::as_digital_credential(
  self : Credential,
) -> DigitalCredential? =
  #| (self) => (self instanceof DigitalCredential) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn Credential::as_identity_credential(
  self : Credential,
) -> IdentityCredential? =
  #| (self) => (self instanceof IdentityCredential) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn Credential::as_otp_credential(
  self : Credential,
) -> OTPCredential? =
  #| (self) => (self instanceof OTPCredential) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn Credential::as_public_key_credential(
  self : Credential,
) -> PublicKeyCredential? =
  #| (self) => (self instanceof PublicKeyCredential) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn Credential::get_id(self : Credential) -> String =
  #| (self) => self.id

///|
pub extern "js" fn Credential::get_type(self : Credential) -> String =
  #| (self) => self.type

///|
pub extern "js" fn Credential::is_conditional_mediation_available() -> Promise[
  Bool,
] =
  #| () => Credential.isConditionalMediationAvailable()

///|
pub extern "js" fn Credential::will_request_conditional_creation() -> Promise[
  Unit,
] =
  #| () => Credential.willRequestConditionalCreation()

///|
/// CredentialsContainer interface
pub type CredentialsContainer

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

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

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

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

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

///|
/// Error type for throwing methods
pub(all) enum CredentialsContainerGetError {
  AbortError(JsError)
  NetworkError(JsError)
  TimeoutError(JsError)
  SecurityError(JsError)
  NotAllowedError(JsError)
  IdentityCredentialError(JsError)
  OtherError(JsError)
} derive(Show)

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

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

///|
pub extern "js" fn CredentialsContainer::get(
  self : CredentialsContainer,
) -> Promise[Result[Credential?, CredentialsContainerGetError]] =
  #| (self) => self.get().then(r => ({ $tag: 1, _0: (() => { const v = r; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'AbortError') return { $tag: 0, _0: e }; if (n === 'NetworkError') return { $tag: 1, _0: e }; if (n === 'TimeoutError') return { $tag: 2, _0: e }; if (n === 'SecurityError') return { $tag: 3, _0: e }; if (n === 'NotAllowedError') return { $tag: 4, _0: e }; if (n === 'IdentityCredentialError') return { $tag: 5, _0: e }; return { $tag: 6, _0: e }; })() }))

///|
extern "js" fn CredentialsContainer::get_with_options_ffi(
  self : CredentialsContainer,
  options : JsValue,
) -> Promise[Result[Credential?, CredentialsContainerGetError]] =
  #| (self, options) => self.get(options).then(r => ({ $tag: 1, _0: (() => { const v = r; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'AbortError') return { $tag: 0, _0: e }; if (n === 'NetworkError') return { $tag: 1, _0: e }; if (n === 'TimeoutError') return { $tag: 2, _0: e }; if (n === 'SecurityError') return { $tag: 3, _0: e }; if (n === 'NotAllowedError') return { $tag: 4, _0: e }; if (n === 'IdentityCredentialError') return { $tag: 5, _0: e }; return { $tag: 6, _0: e }; })() }))

///|
pub fn CredentialsContainer::get_with_options(
  self : CredentialsContainer,
  options : CredentialRequestOptions,
) -> Promise[Result[Credential?, CredentialsContainerGetError]] {
  CredentialsContainer::get_with_options_ffi(self, options.to_js())
}

///|
pub extern "js" fn CredentialsContainer::store(
  self : CredentialsContainer,
  credential : Credential,
) -> Promise[Result[Unit, CredentialsContainerStoreError]] =
  #| (self, credential) => self.store(credential).then(r => ({ $tag: 1, _0: undefined })).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 CredentialsContainer::create(
  self : CredentialsContainer,
) -> Promise[Result[Credential?, CredentialsContainerCreateError]] =
  #| (self) => self.create().then(r => ({ $tag: 1, _0: (() => { const v = r; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'AbortError') return { $tag: 1, _0: e }; if (n === 'NotAllowedError') return { $tag: 2, _0: e }; return { $tag: 3, _0: e }; })() }))

///|
extern "js" fn CredentialsContainer::create_with_options_ffi(
  self : CredentialsContainer,
  options : JsValue,
) -> Promise[Result[Credential?, CredentialsContainerCreateError]] =
  #| (self, options) => self.create(options).then(r => ({ $tag: 1, _0: (() => { const v = r; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'AbortError') return { $tag: 1, _0: e }; if (n === 'NotAllowedError') return { $tag: 2, _0: e }; return { $tag: 3, _0: e }; })() }))

///|
pub fn CredentialsContainer::create_with_options(
  self : CredentialsContainer,
  options : CredentialCreationOptions,
) -> Promise[Result[Credential?, CredentialsContainerCreateError]] {
  CredentialsContainer::create_with_options_ffi(self, options.to_js())
}

///|
pub extern "js" fn CredentialsContainer::prevent_silent_access(
  self : CredentialsContainer,
) -> Promise[Unit] =
  #| (self) => self.preventSilentAccess()

///|
/// PasswordCredential interface
pub type PasswordCredential

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

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

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

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

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

///|
pub extern "js" fn PasswordCredential::to_credential(
  self : PasswordCredential,
) -> Credential =
  #| (self) => self

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

///|
pub extern "js" fn PasswordCredential::new_with_html_form_element(
  form : HTMLFormElement,
) -> Result[PasswordCredential, PasswordCredentialConstructorError] =
  #| (form) => (() => { try { return { $tag: 1, _0: new PasswordCredential(form) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
extern "js" fn PasswordCredential::new_with_password_credential_data_ffi(
  data : JsValue,
) -> Result[PasswordCredential, PasswordCredentialConstructorError] =
  #| (data) => (() => { try { return { $tag: 1, _0: new PasswordCredential(data) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub fn PasswordCredential::new_with_password_credential_data(
  data : PasswordCredentialData,
) -> Result[PasswordCredential, PasswordCredentialConstructorError] {
  PasswordCredential::new_with_password_credential_data_ffi(data.to_js())
}

///|
pub extern "js" fn PasswordCredential::get_password(
  self : PasswordCredential,
) -> String =
  #| (self) => self.password

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

///|
pub extern "js" fn PasswordCredential::get_icon_url(
  self : PasswordCredential,
) -> String =
  #| (self) => self.iconURL

///|
/// FederatedCredential interface
pub type FederatedCredential

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

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

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

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

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

///|
pub extern "js" fn FederatedCredential::to_credential(
  self : FederatedCredential,
) -> Credential =
  #| (self) => self

///|
extern "js" fn FederatedCredential::new_ffi(
  data : JsValue,
) -> FederatedCredential =
  #| (data) => new FederatedCredential(data)

///|
pub fn FederatedCredential::new(
  data : FederatedCredentialInit,
) -> FederatedCredential {
  FederatedCredential::new_ffi(data.to_js())
}

///|
pub extern "js" fn FederatedCredential::get_provider(
  self : FederatedCredential,
) -> String =
  #| (self) => self.provider

///|
pub extern "js" fn FederatedCredential::get_protocol(
  self : FederatedCredential,
) -> String? =
  #| (self) => (self.protocol) ?? undefined

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

///|
pub extern "js" fn FederatedCredential::get_icon_url(
  self : FederatedCredential,
) -> String =
  #| (self) => self.iconURL