// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/secure-payment-confirmation

///|
/// SecurePaymentConfirmationAvailability enum
pub(all) enum SecurePaymentConfirmationAvailability {
  Available
  UnavailableUnknownReason
  UnavailableFeatureNotEnabled
  UnavailableNoPermissionPolicy
  UnavailableNoUserVerifyingPlatformAuthenticator
} derive(Eq, Show)

///|
/// Convert to string value
pub fn SecurePaymentConfirmationAvailability::to_string(
  self : SecurePaymentConfirmationAvailability,
) -> String {
  match self {
    SecurePaymentConfirmationAvailability::Available => "available"
    SecurePaymentConfirmationAvailability::UnavailableUnknownReason =>
      "unavailable-unknown-reason"
    SecurePaymentConfirmationAvailability::UnavailableFeatureNotEnabled =>
      "unavailable-feature-not-enabled"
    SecurePaymentConfirmationAvailability::UnavailableNoPermissionPolicy =>
      "unavailable-no-permission-policy"
    SecurePaymentConfirmationAvailability::UnavailableNoUserVerifyingPlatformAuthenticator =>
      "unavailable-no-user-verifying-platform-authenticator"
  }
}

///|
/// Parse from string value
pub fn SecurePaymentConfirmationAvailability::from_string(
  s : String,
) -> SecurePaymentConfirmationAvailability? {
  match s {
    "available" => Some(SecurePaymentConfirmationAvailability::Available)
    "unavailable-unknown-reason" =>
      Some(SecurePaymentConfirmationAvailability::UnavailableUnknownReason)
    "unavailable-feature-not-enabled" =>
      Some(SecurePaymentConfirmationAvailability::UnavailableFeatureNotEnabled)
    "unavailable-no-permission-policy" =>
      Some(SecurePaymentConfirmationAvailability::UnavailableNoPermissionPolicy)
    "unavailable-no-user-verifying-platform-authenticator" =>
      Some(
        SecurePaymentConfirmationAvailability::UnavailableNoUserVerifyingPlatformAuthenticator,
      )
    _ => None
  }
}

///|
/// SecurePaymentConfirmationRequest dictionary
pub(all) struct SecurePaymentConfirmationRequest {
  challenge : BufferSource
  rpId : String
  credentialIds : Array[BufferSource]
  instrument : PaymentCredentialInstrument
  timeout : Int?
  payeeName : String?
  payeeOrigin : String?
  paymentEntitiesLogos : Array[PaymentEntityLogo]?
  extensions : AuthenticationExtensionsClientInputs?
  browserBoundPubKeyCredParams : Array[PublicKeyCredentialParameters]?
  locale : Array[String]?
  showOptOut : Bool?
}

///|
/// Create a new SecurePaymentConfirmationRequest
pub fn SecurePaymentConfirmationRequest::new(
  challenge~ : BufferSource,
  instrument~ : PaymentCredentialInstrument,
) -> SecurePaymentConfirmationRequest {
  SecurePaymentConfirmationRequest::{
    challenge,
    rpId: "",
    credentialIds: [],
    instrument,
    timeout: None,
    payeeName: None,
    payeeOrigin: None,
    paymentEntitiesLogos: None,
    extensions: None,
    browserBoundPubKeyCredParams: None,
    locale: None,
    showOptOut: None,
  }
}

///|
extern "js" fn SecurePaymentConfirmationRequest::to_js_ffi(
  self : SecurePaymentConfirmationRequest,
) -> JsValue =
  #| (self) => ({
  #|   challenge: self.challenge.to_js_value(),
  #|   rpId: self.rpId,
  #|   credentialIds: self.credentialIds,
  #|   instrument: self.instrument,
  #|   timeout: self.timeout,
  #|   payeeName: self.payeeName,
  #|   payeeOrigin: self.payeeOrigin,
  #|   paymentEntitiesLogos: ((() => { const v = self.paymentEntitiesLogos; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   extensions: ((() => { const v = self.extensions; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   browserBoundPubKeyCredParams: ((() => { const v = self.browserBoundPubKeyCredParams; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   locale: ((() => { const v = self.locale; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   showOptOut: (self.showOptOut === -1 ? undefined : self.showOptOut)
  #| })

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

///|
extern "js" fn SecurePaymentConfirmationRequest::from_js_ffi(
  value : JsValue,
) -> SecurePaymentConfirmationRequest =
  #| (v) => ({
  #|   challenge: v.challenge,
  #|   rpId: v.rpId,
  #|   credentialIds: v.credentialIds,
  #|   instrument: v.instrument,
  #|   timeout: v.timeout,
  #|   payeeName: v.payeeName,
  #|   payeeOrigin: v.payeeOrigin,
  #|   paymentEntitiesLogos: (v.paymentEntitiesLogos === undefined ? { $tag: 0 } : { $tag: 1, _0: v.paymentEntitiesLogos }),
  #|   extensions: (v.extensions === undefined ? { $tag: 0 } : { $tag: 1, _0: v.extensions }),
  #|   browserBoundPubKeyCredParams: (v.browserBoundPubKeyCredParams === undefined ? { $tag: 0 } : { $tag: 1, _0: v.browserBoundPubKeyCredParams }),
  #|   locale: (v.locale === undefined ? { $tag: 0 } : { $tag: 1, _0: v.locale }),
  #|   showOptOut: (v.showOptOut === undefined ? -1 : v.showOptOut)
  #| })

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

///|
/// AuthenticationExtensionsPaymentInputs dictionary
pub(all) struct AuthenticationExtensionsPaymentInputs {
  isPayment : Bool?
  browserBoundPubKeyCredParams : Array[PublicKeyCredentialParameters]?
  rpId : String?
  topOrigin : String?
  payeeName : String?
  payeeOrigin : String?
  paymentEntitiesLogos : Array[PaymentEntityLogo]?
  total : PaymentCurrencyAmount?
  instrument : PaymentCredentialInstrument?
}

///|
/// Create a new AuthenticationExtensionsPaymentInputs with default values
pub fn AuthenticationExtensionsPaymentInputs::default() -> AuthenticationExtensionsPaymentInputs {
  AuthenticationExtensionsPaymentInputs::{
    isPayment: None,
    browserBoundPubKeyCredParams: None,
    rpId: None,
    topOrigin: None,
    payeeName: None,
    payeeOrigin: None,
    paymentEntitiesLogos: None,
    total: None,
    instrument: None,
  }
}

///|
extern "js" fn AuthenticationExtensionsPaymentInputs::to_js_ffi(
  self : AuthenticationExtensionsPaymentInputs,
) -> JsValue =
  #| (self) => ({
  #|   isPayment: (self.isPayment === -1 ? undefined : self.isPayment),
  #|   browserBoundPubKeyCredParams: ((() => { const v = self.browserBoundPubKeyCredParams; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   rpId: self.rpId,
  #|   topOrigin: self.topOrigin,
  #|   payeeName: self.payeeName,
  #|   payeeOrigin: self.payeeOrigin,
  #|   paymentEntitiesLogos: ((() => { const v = self.paymentEntitiesLogos; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   total: ((() => { const v = self.total; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   instrument: ((() => { const v = self.instrument; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

///|
extern "js" fn AuthenticationExtensionsPaymentInputs::from_js_ffi(
  value : JsValue,
) -> AuthenticationExtensionsPaymentInputs =
  #| (v) => ({
  #|   isPayment: (v.isPayment === undefined ? -1 : v.isPayment),
  #|   browserBoundPubKeyCredParams: (v.browserBoundPubKeyCredParams === undefined ? { $tag: 0 } : { $tag: 1, _0: v.browserBoundPubKeyCredParams }),
  #|   rpId: v.rpId,
  #|   topOrigin: v.topOrigin,
  #|   payeeName: v.payeeName,
  #|   payeeOrigin: v.payeeOrigin,
  #|   paymentEntitiesLogos: (v.paymentEntitiesLogos === undefined ? { $tag: 0 } : { $tag: 1, _0: v.paymentEntitiesLogos }),
  #|   total: (v.total === undefined ? { $tag: 0 } : { $tag: 1, _0: v.total }),
  #|   instrument: (v.instrument === undefined ? { $tag: 0 } : { $tag: 1, _0: v.instrument })
  #| })

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

///|
/// AuthenticationExtensionsPaymentOutputs dictionary
pub(all) struct AuthenticationExtensionsPaymentOutputs {
  browserBoundSignature : BrowserBoundSignature?
}

///|
/// Create a new AuthenticationExtensionsPaymentOutputs with default values
pub fn AuthenticationExtensionsPaymentOutputs::default() -> AuthenticationExtensionsPaymentOutputs {
  AuthenticationExtensionsPaymentOutputs::{ browserBoundSignature: None }
}

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

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

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

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

///|
/// BrowserBoundSignature dictionary
pub(all) struct BrowserBoundSignature {
  signature : ArrayBuffer
}

///|
/// Create a new BrowserBoundSignature
pub fn BrowserBoundSignature::new(
  signature~ : ArrayBuffer,
) -> BrowserBoundSignature {
  BrowserBoundSignature::{ signature, }
}

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

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

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

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

///|
/// CollectedClientPaymentData dictionary
pub(all) struct CollectedClientPaymentData {
  payment : CollectedClientAdditionalPaymentDataOrCollectedClientAdditionalPaymentRegistrationData
}

///|
/// Create a new CollectedClientPaymentData
pub fn CollectedClientPaymentData::new(
  payment~ : CollectedClientAdditionalPaymentDataOrCollectedClientAdditionalPaymentRegistrationData,
) -> CollectedClientPaymentData {
  CollectedClientPaymentData::{ payment, }
}

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

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

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

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

///|
/// CollectedClientAdditionalPaymentData dictionary
pub(all) struct CollectedClientAdditionalPaymentData {
  rpId : String
  topOrigin : String
  payeeName : String?
  payeeOrigin : String?
  paymentEntitiesLogos : Array[PaymentEntityLogo]?
  total : PaymentCurrencyAmount
  instrument : PaymentCredentialInstrument
  browserBoundPublicKey : String?
}

///|
/// Create a new CollectedClientAdditionalPaymentData
pub fn CollectedClientAdditionalPaymentData::new(
  total~ : PaymentCurrencyAmount,
  instrument~ : PaymentCredentialInstrument,
) -> CollectedClientAdditionalPaymentData {
  CollectedClientAdditionalPaymentData::{
    rpId: "",
    topOrigin: "",
    payeeName: None,
    payeeOrigin: None,
    paymentEntitiesLogos: None,
    total,
    instrument,
    browserBoundPublicKey: None,
  }
}

///|
extern "js" fn CollectedClientAdditionalPaymentData::to_js_ffi(
  self : CollectedClientAdditionalPaymentData,
) -> JsValue =
  #| (self) => ({
  #|   rpId: self.rpId,
  #|   topOrigin: self.topOrigin,
  #|   payeeName: self.payeeName,
  #|   payeeOrigin: self.payeeOrigin,
  #|   paymentEntitiesLogos: ((() => { const v = self.paymentEntitiesLogos; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   total: self.total,
  #|   instrument: self.instrument,
  #|   browserBoundPublicKey: self.browserBoundPublicKey
  #| })

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

///|
extern "js" fn CollectedClientAdditionalPaymentData::from_js_ffi(
  value : JsValue,
) -> CollectedClientAdditionalPaymentData =
  #| (v) => ({
  #|   rpId: v.rpId,
  #|   topOrigin: v.topOrigin,
  #|   payeeName: v.payeeName,
  #|   payeeOrigin: v.payeeOrigin,
  #|   paymentEntitiesLogos: (v.paymentEntitiesLogos === undefined ? { $tag: 0 } : { $tag: 1, _0: v.paymentEntitiesLogos }),
  #|   total: v.total,
  #|   instrument: v.instrument,
  #|   browserBoundPublicKey: v.browserBoundPublicKey
  #| })

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

///|
/// CollectedClientAdditionalPaymentRegistrationData dictionary
pub(all) struct CollectedClientAdditionalPaymentRegistrationData {
  browserBoundPublicKey : String?
}

///|
/// Create a new CollectedClientAdditionalPaymentRegistrationData with default values
pub fn CollectedClientAdditionalPaymentRegistrationData::default() -> CollectedClientAdditionalPaymentRegistrationData {
  CollectedClientAdditionalPaymentRegistrationData::{
    browserBoundPublicKey: None,
  }
}

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

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

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

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

///|
/// PaymentCredentialInstrument dictionary
pub(all) struct PaymentCredentialInstrument {
  displayName : String
  icon : String
  iconMustBeShown : Bool?
  details : String?
}

///|
/// Create a new PaymentCredentialInstrument with default values
pub fn PaymentCredentialInstrument::default() -> PaymentCredentialInstrument {
  PaymentCredentialInstrument::{
    displayName: "",
    icon: "",
    iconMustBeShown: None,
    details: None,
  }
}

///|
extern "js" fn PaymentCredentialInstrument::to_js_ffi(
  self : PaymentCredentialInstrument,
) -> JsValue =
  #| (self) => ({
  #|   displayName: self.displayName,
  #|   icon: self.icon,
  #|   iconMustBeShown: (self.iconMustBeShown === -1 ? undefined : self.iconMustBeShown),
  #|   details: self.details
  #| })

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

///|
extern "js" fn PaymentCredentialInstrument::from_js_ffi(
  value : JsValue,
) -> PaymentCredentialInstrument =
  #| (v) => ({
  #|   displayName: v.displayName,
  #|   icon: v.icon,
  #|   iconMustBeShown: (v.iconMustBeShown === undefined ? -1 : v.iconMustBeShown),
  #|   details: v.details
  #| })

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

///|
/// PaymentEntityLogo dictionary
pub(all) struct PaymentEntityLogo {
  url : String
  label : String
}

///|
/// Create a new PaymentEntityLogo with default values
pub fn PaymentEntityLogo::default() -> PaymentEntityLogo {
  PaymentEntityLogo::{ url: "", label: "" }
}

///|
extern "js" fn PaymentEntityLogo::to_js_ffi(
  self : PaymentEntityLogo,
) -> JsValue =
  #| (self) => ({
  #|   url: self.url,
  #|   label: self.label
  #| })

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

///|
extern "js" fn PaymentEntityLogo::from_js_ffi(
  value : JsValue,
) -> PaymentEntityLogo =
  #| (v) => ({
  #|   url: v.url,
  #|   label: v.label
  #| })

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