Skip to content

Commit 9fa47ad

Browse files
authored
Merge pull request #4 from calcit-lang/dyn-eq
trying DynEq
2 parents 06abcdb + 857da08 commit 9fa47ad

File tree

6 files changed

+36
-19
lines changed

6 files changed

+36
-19
lines changed

.github/workflows/check.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616

1717
- uses: calcit-lang/[email protected]
1818
with:
19-
version: "0.8.52"
19+
version: "0.8.56"
2020

2121
- uses: dtolnay/rust-toolchain@stable
2222
with:

Cargo.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "calcit_regex"
3-
version = "0.0.7"
3+
version = "0.0.8"
44
authors = ["jiyinyiyong <[email protected]>"]
55
edition = "2021"
66

@@ -13,7 +13,7 @@ crate-type = ["dylib"] # Creates dynamic lib
1313
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1414

1515
[dependencies]
16-
cirru_edn = "0.6.8"
16+
cirru_edn = "0.6.10"
1717
# cirru_edn = { path = "/Users/chenyong/repo/cirru/edn.rs" }
1818
cirru_parser = "0.1.29"
1919
regex = "1.10.4"

calcit.cirru

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compact.cirru

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
{} (:package |regex)
3-
:configs $ {} (:init-fn |regex.test/main!) (:reload-fn |regex.test/reload!) (:version |0.0.7)
3+
:configs $ {} (:init-fn |regex.test/main!) (:reload-fn |regex.test/reload!) (:version |0.0.8)
44
:modules $ []
55
:entries $ {}
66
:files $ {}

src/lib.rs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
11
use std::sync::{Arc, RwLock};
22

3-
use cirru_edn::{Edn, EdnAnyRef, EdnListView};
3+
use cirru_edn::{DynEq, Edn, EdnAnyRef, EdnListView};
44
use regex::Regex;
55

6+
#[derive(Debug)]
7+
struct RegexWrapper(pub Regex);
8+
9+
impl DynEq for RegexWrapper {
10+
fn as_any(&self) -> &dyn std::any::Any {
11+
&self.0
12+
}
13+
14+
fn do_eq(&self, rhs: &dyn DynEq) -> bool {
15+
if let Some(_rhs_concrete) = rhs.as_any().downcast_ref::<Regex>() {
16+
// does not compare the regex pattern
17+
false
18+
} else {
19+
false
20+
}
21+
}
22+
}
23+
624
#[no_mangle]
725
pub fn abi_version() -> String {
826
String::from("0.0.9")
@@ -14,8 +32,7 @@ pub fn re_pattern(args: Vec<Edn>) -> Result<Edn, String> {
1432
match &args[0] {
1533
Edn::Str(s) => match Regex::new(s) {
1634
Ok(pattern) => {
17-
let p = Arc::from(RwLock::new(pattern));
18-
35+
let p = Arc::from(RwLock::new(RegexWrapper(pattern)));
1936
Ok(Edn::AnyRef(EdnAnyRef(p)))
2037
}
2138
Err(e) => Err(format!("re-pattern failed, {}", e)),
@@ -36,7 +53,7 @@ pub fn re_matches(args: Vec<Edn>) -> Result<Edn, String> {
3653
Err(e) => Err(format!("re-matches failed, {}", e)),
3754
},
3855
(Edn::Str(s), Edn::AnyRef(EdnAnyRef(p))) => {
39-
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.downcast_ref::<Regex>() {
56+
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.as_any().downcast_ref::<Regex>() {
4057
Ok(Edn::Bool(pattern.is_match(s)))
4158
} else {
4259
Err(format!("re-matches expected a regex, got {:?}", p))
@@ -63,7 +80,7 @@ pub fn re_find_index(args: Vec<Edn>) -> Result<Edn, String> {
6380
}
6481
}
6582
(Edn::Str(s), Edn::AnyRef(EdnAnyRef(p))) => {
66-
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.downcast_ref::<Regex>() {
83+
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.as_any().downcast_ref::<Regex>() {
6784
match pattern.find(s) {
6885
Some(matched) => Ok(Edn::Number(matched.start() as f64)),
6986
None => Ok(Edn::Number(-1.0)), // TODO maybe nil
@@ -97,7 +114,7 @@ pub fn re_find(args: Vec<Edn>) -> Result<Edn, String> {
97114
}
98115
}
99116
(Edn::Str(s), Edn::AnyRef(EdnAnyRef(p))) => {
100-
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.downcast_ref::<Regex>() {
117+
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.as_any().downcast_ref::<Regex>() {
101118
let mut matched = pattern.find_iter(s);
102119
match matched.next() {
103120
Some(v) => Ok(Edn::str(v.as_str().to_string())),
@@ -129,7 +146,7 @@ pub fn re_find_all(args: Vec<Edn>) -> Result<Edn, String> {
129146
Err(e) => Err(format!("re-find-all failed, {}", e)),
130147
},
131148
(Edn::Str(s), Edn::AnyRef(EdnAnyRef(p))) => {
132-
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.downcast_ref::<Regex>() {
149+
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.as_any().downcast_ref::<Regex>() {
133150
let mut ys: Vec<Edn> = vec![];
134151
for v in pattern.find_iter(s) {
135152
ys.push(Edn::Str(v.as_str().to_string().into()))
@@ -161,7 +178,7 @@ pub fn re_split(args: Vec<Edn>) -> Result<Edn, String> {
161178
Err(e) => Err(format!("re-split failed, {}", e)),
162179
},
163180
(Edn::Str(s), Edn::AnyRef(EdnAnyRef(p))) => {
164-
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.downcast_ref::<Regex>() {
181+
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.as_any().downcast_ref::<Regex>() {
165182
let mut ys: Vec<Edn> = vec![];
166183
for piece in pattern.split(s) {
167184
ys.push(Edn::str(piece));
@@ -187,7 +204,7 @@ pub fn re_replace_all(args: Vec<Edn>) -> Result<Edn, String> {
187204
Err(e) => Err(format!("re-replace-all failed, {}", e)),
188205
},
189206
(Edn::Str(s), Edn::AnyRef(EdnAnyRef(p)), Edn::Str(next)) => {
190-
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.downcast_ref::<Regex>() {
207+
if let Some(pattern) = p.read().map_err(|e| e.to_string())?.as_any().downcast_ref::<Regex>() {
191208
Ok(Edn::str(pattern.replace_all(s, &**next).into_owned()))
192209
} else {
193210
Err(format!("re-replace-all expected a regex, got {:?}", p))

0 commit comments

Comments
 (0)