Skip to content

Commit 64802b6

Browse files
committed
init
0 parents  commit 64802b6

File tree

7 files changed

+412
-0
lines changed

7 files changed

+412
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/target
2+
/Cargo.lock
3+
/.vscode

Cargo.toml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[package]
2+
name = "rhai-url"
3+
version = "0.0.1"
4+
edition = "2021"
5+
repository = "https://github.com/lucacicada/rhai-url"
6+
readme = "README.md"
7+
license = "MIT"
8+
description = "Url package for Rhai"
9+
keywords = ["scripting", "scripting-language", "embedded", "rhai", "url"]
10+
categories = ["embedded"]
11+
12+
[dependencies]
13+
rhai = { version = ">=1.9" }
14+
url = { version = ">=2.0" }

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2022 Luca
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# `rhai-url`
2+
3+
This crate provides `url::Url` access for the [Rhai] scripting language.
4+
5+
## Usage
6+
7+
### `Cargo.toml`
8+
9+
```toml
10+
[dependencies]
11+
rhai-url = "0.0.1"
12+
```
13+
14+
### [Rhai] script
15+
16+
```js
17+
let url = Url("http://example.com/?q=query");
18+
19+
print(url.href); // print 'http://example.com/?q=query'
20+
print(url.to_string()); // print 'http://example.com/?q=query'
21+
22+
print(url.query); // print 'q=query'
23+
24+
// fragment and hash are aliases
25+
print(url.fragment); // print ''
26+
print(url.hash); // print ''
27+
28+
url.query_clear();
29+
print(url.query); // print ''
30+
31+
url.query_remove("q");
32+
url.query_append("q", "name");
33+
```
34+
35+
### Rust source
36+
37+
```rust
38+
use rhai::{Engine, EvalAltResult};
39+
use rhai::packages::Package;
40+
use rhai_url::UrlPackage;
41+
use url::Url;
42+
43+
fn main() -> Result<(), Box<EvalAltResult>> {
44+
// Create Rhai scripting engine
45+
let mut engine = Engine::new();
46+
47+
// Create url package and add the package into the engine
48+
let package = UrlPackage::new();
49+
package.register_into_engine(&mut engine);
50+
51+
// Print the url
52+
let url = engine.eval::<Url>(r#"Url("http://test.dev/")"#)?;
53+
54+
println!("{}", url);
55+
56+
// Print the url string, equivalent of to_string()
57+
let href = engine.eval::<String>(r#"Url("http://test.dev/").href"#)?;
58+
59+
println!("{}", href);
60+
61+
Ok(())
62+
}
63+
```

src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
use rhai::def_package;
2+
use rhai::plugin::*;
3+
4+
pub(crate) mod url;
5+
6+
def_package! {
7+
pub UrlPackage(lib) {
8+
combine_with_exported_module!(lib, "rhai_url", url::url_module);
9+
}
10+
}

src/url.rs

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
use rhai::plugin::*;
2+
3+
#[export_module]
4+
pub mod url_module {
5+
use url::Url;
6+
7+
#[rhai_fn(name = "Url", return_raw)]
8+
pub fn new(url: &str) -> Result<Url, Box<EvalAltResult>> {
9+
Url::parse(url).map_err(|e| Box::<EvalAltResult>::from(e.to_string()))
10+
}
11+
12+
#[rhai_fn(global, get = "href", pure)]
13+
pub fn href(url: &mut Url) -> ImmutableString {
14+
url.to_string().into()
15+
}
16+
17+
#[rhai_fn(global, get = "scheme", pure)]
18+
pub fn scheme(url: &mut Url) -> ImmutableString {
19+
url.scheme().into()
20+
}
21+
22+
#[rhai_fn(global, set = "scheme", pure)]
23+
pub fn set_scheme(url: &mut Url, value: &str) {
24+
_ = url.set_scheme(value);
25+
}
26+
27+
#[rhai_fn(global, get = "domain", pure)]
28+
pub fn domain(url: &mut Url) -> ImmutableString {
29+
url.domain().unwrap_or("").into()
30+
}
31+
32+
#[rhai_fn(global, get = "path", pure)]
33+
pub fn path(url: &mut Url) -> ImmutableString {
34+
url.path().into()
35+
}
36+
37+
#[rhai_fn(global, set = "path", pure)]
38+
pub fn set_path(url: &mut Url, value: &str) {
39+
url.set_path(value)
40+
}
41+
42+
#[rhai_fn(global, get = "query", pure)]
43+
pub fn query(url: &mut Url) -> ImmutableString {
44+
url.query().unwrap_or("").into()
45+
}
46+
47+
#[rhai_fn(global, set = "query", pure)]
48+
pub fn set_query(url: &mut Url, value: &str) {
49+
if value.len() > 0 {
50+
url.set_query(Some(value))
51+
} else {
52+
url.set_query(None)
53+
}
54+
}
55+
56+
#[rhai_fn(global, set = "query", pure)]
57+
pub fn set_query_option(url: &mut Url, value: Option<&str>) {
58+
match value {
59+
Some(value) => url.set_query(Some(value)),
60+
None => url.set_query(None),
61+
}
62+
}
63+
64+
#[rhai_fn(global, get = "fragment", pure)]
65+
pub fn fragment(url: &mut Url) -> ImmutableString {
66+
url.fragment().unwrap_or("").into()
67+
}
68+
69+
#[rhai_fn(global, set = "fragment", pure)]
70+
pub fn set_fragment(url: &mut Url, value: &str) {
71+
if value.len() > 0 {
72+
url.set_fragment(Some(value))
73+
} else {
74+
url.set_fragment(None)
75+
}
76+
}
77+
78+
#[rhai_fn(global, set = "fragment", pure)]
79+
pub fn set_fragment_option(url: &mut Url, value: Option<&str>) {
80+
match value {
81+
Some(value) => url.set_fragment(Some(value)),
82+
None => url.set_query(None),
83+
}
84+
}
85+
86+
#[rhai_fn(global, get = "hash", pure)]
87+
pub fn hash(url: &mut Url) -> ImmutableString {
88+
url.fragment().unwrap_or("").into()
89+
}
90+
91+
#[rhai_fn(global, set = "hash", pure)]
92+
pub fn set_hash(url: &mut Url, value: &str) {
93+
if value.len() > 0 {
94+
url.set_fragment(Some(value))
95+
} else {
96+
url.set_fragment(None)
97+
}
98+
}
99+
100+
#[rhai_fn(global, set = "hash", pure)]
101+
pub fn set_hash_option(url: &mut Url, value: Option<&str>) {
102+
match value {
103+
Some(value) => url.set_fragment(Some(value)),
104+
None => url.set_query(None),
105+
}
106+
}
107+
108+
/*************************************************************
109+
* Functions
110+
************************************************************/
111+
112+
#[rhai_fn(
113+
global,
114+
name = "query_clear",
115+
name = "query_delete",
116+
name = "query_remove",
117+
pure
118+
)]
119+
pub fn query_clear(url: &mut Url) {
120+
url.set_query(None)
121+
}
122+
123+
#[rhai_fn(global, name = "query_delete", name = "query_remove", pure)]
124+
pub fn query_delete(url: &mut Url, key: &str) {
125+
let query: Vec<(String, String)> = url
126+
.query_pairs()
127+
.filter(|(name, _)| name != key)
128+
.map(|(name, value)| (name.into_owned(), value.into_owned()))
129+
.collect();
130+
131+
url.query_pairs_mut().clear().extend_pairs(&query);
132+
133+
// cleanup
134+
if let Some(q) = url.query() {
135+
if q.len() == 0 {
136+
url.set_query(None)
137+
}
138+
}
139+
}
140+
141+
#[rhai_fn(global, name = "query_append", pure)]
142+
pub fn query_append(url: &mut Url, key: &str, value: &str) {
143+
url.query_pairs_mut().append_pair(key, value);
144+
}
145+
146+
#[rhai_fn(global, name = "query_set", pure)]
147+
pub fn query_set(url: &mut Url, key: &str, value: &str) {
148+
query_delete(url, key);
149+
query_append(url, key, value);
150+
}
151+
152+
#[rhai_fn(global, name = "query_get", pure)]
153+
pub fn query_get(url: &mut Url, key: &str) -> ImmutableString {
154+
match url.query_pairs().find(|(name, _)| name == key) {
155+
Some((_, value)) => ImmutableString::from(value.as_ref()),
156+
None => ImmutableString::from(""),
157+
}
158+
}
159+
160+
#[rhai_fn(global, name = "query_gets", name = "query_getAll", pure)]
161+
pub fn query_gets(url: &mut Url, key: &str) -> Vec<ImmutableString> {
162+
url.query_pairs()
163+
.filter(|(name, _)| name == key)
164+
.map(|(_, value)| ImmutableString::from(value.as_ref()))
165+
.collect()
166+
}
167+
168+
#[rhai_fn(global, name = "to_string", name = "to_debug", pure)]
169+
pub fn to_string(url: &mut Url) -> ImmutableString {
170+
url.to_string().into()
171+
}
172+
}

0 commit comments

Comments
 (0)