1#![allow(unused_variables)]
2
3#[cfg(target_arch = "wasm32")]
27use sapp_jsutils::{JsObject, JsObjectWeak};
28
29#[no_mangle]
30#[cfg(target_arch = "wasm32")]
31extern "C" fn quad_url_crate_version() -> u32 {
32 let major = env!("CARGO_PKG_VERSION_MAJOR").parse::<u32>().unwrap();
33 let minor = env!("CARGO_PKG_VERSION_MINOR").parse::<u32>().unwrap();
34 let patch = env!("CARGO_PKG_VERSION_PATCH").parse::<u32>().unwrap();
35
36 (major << 24) + (minor << 16) + patch
37}
38
39#[cfg(target_arch = "wasm32")]
40extern "C" {
41 fn quad_url_path(full: u32) -> JsObject;
42
43 fn quad_url_param_count() -> i32;
44 fn quad_url_get_key(pos: i32) -> JsObject;
45 fn quad_url_get_value(pos: i32) -> JsObject;
46
47 fn quad_url_delete_program_parameter(name: JsObjectWeak);
48 fn quad_url_set_program_parameter(name: JsObjectWeak, value: JsObjectWeak);
49
50 fn quad_url_get_hash() -> JsObject;
51 fn quad_url_set_hash(value: JsObjectWeak);
52
53 fn quad_url_link_open(url: JsObjectWeak, new_tab: u32);
54}
55
56pub fn get_program_parameters() -> Vec<String> {
81 #[cfg(target_arch = "wasm32")]
82 {
83 let count = unsafe { quad_url_param_count() };
84 let mut path = String::new();
85 unsafe {
86 quad_url_path(0).to_string(&mut path);
87 }
88 let mut result = vec![path];
89 for i in 0..count {
90 let mut key = String::new();
91 unsafe {
92 quad_url_get_key(i).to_string(&mut key);
93 }
94
95 let mut value = String::new();
96 unsafe {
97 quad_url_get_value(i).to_string(&mut value);
98 }
99
100 let dash = if key.chars().count() == 1 { "-" } else { "--" };
101 if value == "" {
102 result.push(format!("{}{}", dash, key));
103 } else {
104 result.push(format!("{}{}={}", dash, key, &value));
105 }
106 }
107 result
108 }
109
110 #[cfg(not(target_arch = "wasm32"))]
111 {
112 std::env::args().collect()
113 }
114}
115
116pub fn path(full: bool) -> String {
118 #[cfg(target_arch = "wasm32")]
119 {
120 let mut path = String::new();
121 unsafe {
122 quad_url_path(full as u32).to_string(&mut path);
123 }
124 path
125 }
126
127 #[cfg(not(target_arch = "wasm32"))]
128 {
129 if full {
130 std::env::args().collect::<Vec<_>>().join(" ")
131 } else {
132 std::env::args().next().unwrap()
133 }
134 }
135}
136
137pub fn easy_parse(param: &str) -> Option<(&str, Option<&str>)> {
143 let skip_len = if param.starts_with("--") {
144 "--".len()
145 } else if param.starts_with('-') {
146 "-".len()
147 } else {
148 return None;
149 };
150
151 if let Some(pos) = param.chars().position(|x| x == '=') {
152 let name = ¶m[skip_len..pos];
153 let value = ¶m[pos + '='.len_utf8()..];
154 if value.is_empty() {
155 Some((name, None))
156 } else {
157 Some((name, Some(value)))
158 }
159 } else {
160 Some((¶m[skip_len..], None))
161 }
162}
163
164pub fn delete_program_parameter(name: &str) {
166 #[cfg(target_arch = "wasm32")]
167 {
168 let name = JsObject::string(name);
169 unsafe {
170 quad_url_delete_program_parameter(name.weak());
171 }
172 drop(name);
173 }
174}
175
176pub fn set_program_parameter(name: &str, value: &str) {
178 #[cfg(target_arch = "wasm32")]
179 {
180 let name = JsObject::string(name);
181 let value = JsObject::string(value);
182 unsafe {
183 quad_url_set_program_parameter(name.weak(), value.weak());
184 }
185 drop(name);
186 drop(value);
187 }
188}
189
190pub fn get_hash() -> String {
192 #[cfg(target_arch = "wasm32")]
193 {
194 let mut value = String::new();
195 unsafe {
196 quad_url_get_hash().to_string(&mut value);
197 }
198 value
199 }
200
201 #[cfg(not(target_arch = "wasm32"))]
202 {
203 String::new()
204 }
205}
206
207pub fn set_hash(value: &str) {
209 #[cfg(target_arch = "wasm32")]
210 {
211 let value = JsObject::string(value);
212 unsafe {
213 quad_url_set_hash(value.weak());
214 }
215 drop(value);
216 }
217}
218
219pub fn link_open(url: &str, new_tab: bool) {
221 #[cfg(target_arch = "wasm32")]
222 {
223 let url = JsObject::string(url);
224 unsafe {
225 quad_url_link_open(url.weak(), new_tab as u32);
226 }
227 drop(url);
228 }
229
230 #[cfg(any(
231 target_os = "linux",
232 target_os = "windows",
233 target_os = "macos",
234 target_os = "android",
235 ))]
236 {
237 if let Err(err) = webbrowser::open(url) {
238 eprintln!("Failed to open url: {}, url: `{}`", err, url);
239 }
240 }
241}