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

///|
/// URLPatternInput typedef
pub type URLPatternInput

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

///|
/// Create URLPatternInput from String
pub extern "js" fn URLPatternInput::from_string(v : String) -> URLPatternInput =
  #| (v) => v

///|
/// Create URLPatternInput from URLPatternInit
pub extern "js" fn URLPatternInput::from_url_pattern_init(
  v : URLPatternInit,
) -> URLPatternInput =
  #| (v) => v

///|
/// Check if this URLPatternInput is String
pub extern "js" fn URLPatternInput::is_string(self : URLPatternInput) -> Bool =
  #| (self) => typeof self === 'string'

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

///|
/// Try to get URLPatternInput as String
pub extern "js" fn URLPatternInput::as_string(
  self : URLPatternInput,
) -> String? =
  #| (self) => (typeof self === 'string') ? self : undefined

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

///|
/// Flatten Option[URLPatternInput] to String?
pub fn URLPatternInput::bind_as_string(value : URLPatternInput?) -> String? {
  match value {
    Some(v) => v.as_string()
    None => None
  }
}

///|
/// Flatten Option[URLPatternInput] to URLPatternInit?
pub fn URLPatternInput::bind_as_url_pattern_init(
  value : URLPatternInput?,
) -> URLPatternInit? {
  match value {
    Some(v) => v.as_url_pattern_init()
    None => None
  }
}

///|
/// URLPatternCompatible typedef
pub type URLPatternCompatible

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

///|
/// Create URLPatternCompatible from String
pub extern "js" fn URLPatternCompatible::from_string(
  v : String,
) -> URLPatternCompatible =
  #| (v) => v

///|
/// Create URLPatternCompatible from URLPatternInit
pub extern "js" fn URLPatternCompatible::from_url_pattern_init(
  v : URLPatternInit,
) -> URLPatternCompatible =
  #| (v) => v

///|
/// Create URLPatternCompatible from URLPattern
pub extern "js" fn URLPatternCompatible::from_url_pattern(
  v : URLPattern,
) -> URLPatternCompatible =
  #| (v) => v

///|
/// Check if this URLPatternCompatible is String
pub extern "js" fn URLPatternCompatible::is_string(
  self : URLPatternCompatible,
) -> Bool =
  #| (self) => typeof self === 'string'

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

///|
/// Check if this URLPatternCompatible is URLPattern
pub extern "js" fn URLPatternCompatible::is_url_pattern(
  self : URLPatternCompatible,
) -> Bool =
  #| (self) => self instanceof URLPattern

///|
/// Try to get URLPatternCompatible as String
pub extern "js" fn URLPatternCompatible::as_string(
  self : URLPatternCompatible,
) -> String? =
  #| (self) => (typeof self === 'string') ? self : undefined

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

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

///|
/// Flatten Option[URLPatternCompatible] to String?
pub fn URLPatternCompatible::bind_as_string(
  value : URLPatternCompatible?,
) -> String? {
  match value {
    Some(v) => v.as_string()
    None => None
  }
}

///|
/// Flatten Option[URLPatternCompatible] to URLPatternInit?
pub fn URLPatternCompatible::bind_as_url_pattern_init(
  value : URLPatternCompatible?,
) -> URLPatternInit? {
  match value {
    Some(v) => v.as_url_pattern_init()
    None => None
  }
}

///|
/// Flatten Option[URLPatternCompatible] to URLPattern?
pub fn URLPatternCompatible::bind_as_url_pattern(
  value : URLPatternCompatible?,
) -> URLPattern? {
  match value {
    Some(v) => v.as_url_pattern()
    None => None
  }
}

///|
/// URLPatternInit dictionary
pub(all) struct URLPatternInit {
  protocol : String?
  username : String?
  password : String?
  hostname : String?
  port : String?
  pathname : String?
  search : String?
  hash : String?
  baseURL : String?
}

///|
/// Create a new URLPatternInit with default values
pub fn URLPatternInit::default() -> URLPatternInit {
  URLPatternInit::{
    protocol: None,
    username: None,
    password: None,
    hostname: None,
    port: None,
    pathname: None,
    search: None,
    hash: None,
    baseURL: None,
  }
}

///|
extern "js" fn URLPatternInit::to_js_ffi(self : URLPatternInit) -> JsValue =
  #| (self) => ({
  #|   protocol: self.protocol,
  #|   username: self.username,
  #|   password: self.password,
  #|   hostname: self.hostname,
  #|   port: self.port,
  #|   pathname: self.pathname,
  #|   search: self.search,
  #|   hash: self.hash,
  #|   baseURL: self.baseURL
  #| })

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

///|
extern "js" fn URLPatternInit::from_js_ffi(value : JsValue) -> URLPatternInit =
  #| (v) => ({
  #|   protocol: v.protocol,
  #|   username: v.username,
  #|   password: v.password,
  #|   hostname: v.hostname,
  #|   port: v.port,
  #|   pathname: v.pathname,
  #|   search: v.search,
  #|   hash: v.hash,
  #|   baseURL: v.baseURL
  #| })

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

///|
/// URLPatternOptions dictionary
pub(all) struct URLPatternOptions {
  ignoreCase : Bool?
}

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

///|
extern "js" fn URLPatternOptions::to_js_ffi(
  self : URLPatternOptions,
) -> JsValue =
  #| (self) => ({
  #|   ignoreCase: (self.ignoreCase === -1 ? undefined : self.ignoreCase)
  #| })

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

///|
extern "js" fn URLPatternOptions::from_js_ffi(
  value : JsValue,
) -> URLPatternOptions =
  #| (v) => ({
  #|   ignoreCase: (v.ignoreCase === undefined ? -1 : v.ignoreCase)
  #| })

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

///|
/// URLPatternResult dictionary
pub(all) struct URLPatternResult {
  inputs : Array[URLPatternInput]?
  protocol : URLPatternComponentResult?
  username : URLPatternComponentResult?
  password : URLPatternComponentResult?
  hostname : URLPatternComponentResult?
  port : URLPatternComponentResult?
  pathname : URLPatternComponentResult?
  search : URLPatternComponentResult?
  hash : URLPatternComponentResult?
}

///|
/// Create a new URLPatternResult with default values
pub fn URLPatternResult::default() -> URLPatternResult {
  URLPatternResult::{
    inputs: None,
    protocol: None,
    username: None,
    password: None,
    hostname: None,
    port: None,
    pathname: None,
    search: None,
    hash: None,
  }
}

///|
extern "js" fn URLPatternResult::to_js_ffi(self : URLPatternResult) -> JsValue =
  #| (self) => ({
  #|   inputs: ((() => { const v = self.inputs; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   protocol: ((() => { const v = self.protocol; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   username: ((() => { const v = self.username; 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; })()),
  #|   hostname: ((() => { const v = self.hostname; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   port: ((() => { const v = self.port; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   pathname: ((() => { const v = self.pathname; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   search: ((() => { const v = self.search; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   hash: ((() => { const v = self.hash; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

///|
extern "js" fn URLPatternResult::from_js_ffi(
  value : JsValue,
) -> URLPatternResult =
  #| (v) => ({
  #|   inputs: (v.inputs === undefined ? { $tag: 0 } : { $tag: 1, _0: v.inputs }),
  #|   protocol: (v.protocol === undefined ? { $tag: 0 } : { $tag: 1, _0: v.protocol }),
  #|   username: (v.username === undefined ? { $tag: 0 } : { $tag: 1, _0: v.username }),
  #|   password: (v.password === undefined ? { $tag: 0 } : { $tag: 1, _0: v.password }),
  #|   hostname: (v.hostname === undefined ? { $tag: 0 } : { $tag: 1, _0: v.hostname }),
  #|   port: (v.port === undefined ? { $tag: 0 } : { $tag: 1, _0: v.port }),
  #|   pathname: (v.pathname === undefined ? { $tag: 0 } : { $tag: 1, _0: v.pathname }),
  #|   search: (v.search === undefined ? { $tag: 0 } : { $tag: 1, _0: v.search }),
  #|   hash: (v.hash === undefined ? { $tag: 0 } : { $tag: 1, _0: v.hash })
  #| })

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

///|
/// URLPatternComponentResult dictionary
pub(all) struct URLPatternComponentResult {
  input : String?
  groups : JsValue?
}

///|
/// Create a new URLPatternComponentResult with default values
pub fn URLPatternComponentResult::default() -> URLPatternComponentResult {
  URLPatternComponentResult::{ input: None, groups: None }
}

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

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

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

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

///|
/// URLPattern interface
pub type URLPattern

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

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

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

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

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

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

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

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

///|
pub extern "js" fn URLPattern::new() -> Result[
  URLPattern,
  URLPatternConstructorError,
] =
  #| () => (() => { try { return { $tag: 1, _0: new URLPattern() }; } 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 URLPattern::new_with_options_ffi(
  input : URLPatternInput,
  options : JsValue,
) -> Result[URLPattern, URLPatternConstructorError] =
  #| (input, options) => (() => { try { return { $tag: 1, _0: new URLPattern(input, options) }; } 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 URLPattern::new_with_options(
  input : URLPatternInput,
  options : URLPatternOptions,
) -> Result[URLPattern, URLPatternConstructorError] {
  URLPattern::new_with_options_ffi(input, options.to_js())
}

///|
pub extern "js" fn URLPattern::new_with_input_and_base_url(
  input : URLPatternInput,
  base_url : String,
) -> Result[URLPattern, URLPatternConstructorError] =
  #| (input, base_url) => (() => { try { return { $tag: 1, _0: new URLPattern(input, base_url) }; } 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 URLPattern::new_with_input_and_base_url_with_options_ffi(
  input : URLPatternInput,
  base_url : String,
  options : JsValue,
) -> Result[URLPattern, URLPatternConstructorError] =
  #| (input, base_url, options) => (() => { try { return { $tag: 1, _0: new URLPattern(input, base_url, options) }; } 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 URLPattern::new_with_input_and_base_url_with_options(
  input : URLPatternInput,
  base_url : String,
  options : URLPatternOptions,
) -> Result[URLPattern, URLPatternConstructorError] {
  URLPattern::new_with_input_and_base_url_with_options_ffi(
    input,
    base_url,
    options.to_js(),
  )
}

///|
pub extern "js" fn URLPattern::test_(
  self : URLPattern,
) -> Result[Bool, URLPatternTestError] =
  #| (self) => (() => { try { return { $tag: 1, _0: self.test() }; } 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 extern "js" fn URLPattern::test__with_base_url(
  self : URLPattern,
  input : URLPatternInput,
  base_url : String,
) -> Result[Bool, URLPatternTestError] =
  #| (self, input, base_url) => (() => { try { return { $tag: 1, _0: self.test(input, base_url) }; } 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 extern "js" fn URLPattern::exec(
  self : URLPattern,
) -> Result[URLPatternResult?, URLPatternExecError] =
  #| (self) => (() => { try { return { $tag: 1, _0: (() => { const v = self.exec(); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() }; } 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 extern "js" fn URLPattern::exec_with_base_url(
  self : URLPattern,
  input : URLPatternInput,
  base_url : String,
) -> Result[URLPatternResult?, URLPatternExecError] =
  #| (self, input, base_url) => (() => { try { return { $tag: 1, _0: (() => { const v = self.exec(input, base_url); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() }; } 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 extern "js" fn URLPattern::get_protocol(self : URLPattern) -> String =
  #| (self) => self.protocol

///|
pub extern "js" fn URLPattern::get_username(self : URLPattern) -> String =
  #| (self) => self.username

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

///|
pub extern "js" fn URLPattern::get_hostname(self : URLPattern) -> String =
  #| (self) => self.hostname

///|
pub extern "js" fn URLPattern::get_port(self : URLPattern) -> String =
  #| (self) => self.port

///|
pub extern "js" fn URLPattern::get_pathname(self : URLPattern) -> String =
  #| (self) => self.pathname

///|
pub extern "js" fn URLPattern::get_search(self : URLPattern) -> String =
  #| (self) => self.search

///|
pub extern "js" fn URLPattern::get_hash(self : URLPattern) -> String =
  #| (self) => self.hash

///|
pub extern "js" fn URLPattern::get_has_reg_exp_groups(
  self : URLPattern,
) -> Bool =
  #| (self) => self.hasRegExpGroups

///|
pub extern "js" fn URLPattern::new_with_string(
  input : String,
  base_url : String,
  options : URLPatternOptions,
) -> Result[URLPattern, URLPatternConstructorError] =
  #| (input, base_url, options) => (() => { try { return { $tag: 1, _0: new URLPattern(input, base_url, options) }; } 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 extern "js" fn URLPattern::new_with_url_pattern_init(
  input : URLPatternInit,
  base_url : String,
  options : URLPatternOptions,
) -> Result[URLPattern, URLPatternConstructorError] =
  #| (input, base_url, options) => (() => { try { return { $tag: 1, _0: new URLPattern(input, base_url, options) }; } 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 extern "js" fn URLPattern::test__with_string(
  self : URLPattern,
  input : String,
  base_url : String,
) -> Result[Bool, URLPatternTestError] =
  #| (self, input, base_url) => (() => { try { return { $tag: 1, _0: self.test(input, base_url) }; } 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 extern "js" fn URLPattern::test__with_url_pattern_init(
  self : URLPattern,
  input : URLPatternInit,
  base_url : String,
) -> Result[Bool, URLPatternTestError] =
  #| (self, input, base_url) => (() => { try { return { $tag: 1, _0: self.test(input, base_url) }; } 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 extern "js" fn URLPattern::exec_with_string(
  self : URLPattern,
  input : String,
  base_url : String,
) -> Result[URLPatternResult?, URLPatternExecError] =
  #| (self, input, base_url) => (() => { try { return { $tag: 1, _0: (() => { const v = self.exec(input, base_url); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() }; } 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 extern "js" fn URLPattern::exec_with_url_pattern_init(
  self : URLPattern,
  input : URLPatternInit,
  base_url : String,
) -> Result[URLPatternResult?, URLPatternExecError] =
  #| (self, input, base_url) => (() => { try { return { $tag: 1, _0: (() => { const v = self.exec(input, base_url); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()