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