1
- use std:: { cell :: RefCell , sync:: Arc } ;
1
+ use std:: sync:: { Arc , RwLock } ;
2
2
3
3
use cirru_edn:: { Edn , EdnAnyRef , EdnListView } ;
4
4
use regex:: Regex ;
5
5
6
6
#[ no_mangle]
7
7
pub fn abi_version ( ) -> String {
8
- String :: from ( "0.0.8 " )
8
+ String :: from ( "0.0.9 " )
9
9
}
10
10
11
11
#[ no_mangle]
@@ -14,7 +14,7 @@ pub fn re_pattern(args: Vec<Edn>) -> Result<Edn, String> {
14
14
match & args[ 0 ] {
15
15
Edn :: Str ( s) => match Regex :: new ( s) {
16
16
Ok ( pattern) => {
17
- let p = Arc :: from ( RefCell :: new ( pattern) ) ;
17
+ let p = Arc :: from ( RwLock :: new ( pattern) ) ;
18
18
19
19
Ok ( Edn :: AnyRef ( EdnAnyRef ( p) ) )
20
20
}
@@ -36,7 +36,7 @@ pub fn re_matches(args: Vec<Edn>) -> Result<Edn, String> {
36
36
Err ( e) => Err ( format ! ( "re-matches failed, {}" , e) ) ,
37
37
} ,
38
38
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
39
- if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
39
+ if let Some ( pattern) = p. read ( ) . map_err ( |e| e . to_string ( ) ) ? . downcast_ref :: < Regex > ( ) {
40
40
Ok ( Edn :: Bool ( pattern. is_match ( s) ) )
41
41
} else {
42
42
Err ( format ! ( "re-matches expected a regex, got {:?}" , p) )
@@ -63,7 +63,7 @@ pub fn re_find_index(args: Vec<Edn>) -> Result<Edn, String> {
63
63
}
64
64
}
65
65
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
66
- if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
66
+ if let Some ( pattern) = p. read ( ) . map_err ( |e| e . to_string ( ) ) ? . downcast_ref :: < Regex > ( ) {
67
67
match pattern. find ( s) {
68
68
Some ( matched) => Ok ( Edn :: Number ( matched. start ( ) as f64 ) ) ,
69
69
None => Ok ( Edn :: Number ( -1.0 ) ) , // TODO maybe nil
@@ -97,7 +97,7 @@ pub fn re_find(args: Vec<Edn>) -> Result<Edn, String> {
97
97
}
98
98
}
99
99
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
100
- if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
100
+ if let Some ( pattern) = p. read ( ) . map_err ( |e| e . to_string ( ) ) ? . downcast_ref :: < Regex > ( ) {
101
101
let mut matched = pattern. find_iter ( s) ;
102
102
match matched. next ( ) {
103
103
Some ( v) => Ok ( Edn :: str ( v. as_str ( ) . to_string ( ) ) ) ,
@@ -129,7 +129,7 @@ pub fn re_find_all(args: Vec<Edn>) -> Result<Edn, String> {
129
129
Err ( e) => Err ( format ! ( "re-find-all failed, {}" , e) ) ,
130
130
} ,
131
131
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
132
- if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
132
+ if let Some ( pattern) = p. read ( ) . map_err ( |e| e . to_string ( ) ) ? . downcast_ref :: < Regex > ( ) {
133
133
let mut ys: Vec < Edn > = vec ! [ ] ;
134
134
for v in pattern. find_iter ( s) {
135
135
ys. push ( Edn :: Str ( v. as_str ( ) . to_string ( ) . into ( ) ) )
@@ -161,7 +161,7 @@ pub fn re_split(args: Vec<Edn>) -> Result<Edn, String> {
161
161
Err ( e) => Err ( format ! ( "re-split failed, {}" , e) ) ,
162
162
} ,
163
163
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
164
- if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
164
+ if let Some ( pattern) = p. read ( ) . map_err ( |e| e . to_string ( ) ) ? . downcast_ref :: < Regex > ( ) {
165
165
let mut ys: Vec < Edn > = vec ! [ ] ;
166
166
for piece in pattern. split ( s) {
167
167
ys. push ( Edn :: str ( piece) ) ;
@@ -187,7 +187,7 @@ pub fn re_replace_all(args: Vec<Edn>) -> Result<Edn, String> {
187
187
Err ( e) => Err ( format ! ( "re-replace-all failed, {}" , e) ) ,
188
188
} ,
189
189
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) , Edn :: Str ( next) ) => {
190
- if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
190
+ if let Some ( pattern) = p. read ( ) . map_err ( |e| e . to_string ( ) ) ? . downcast_ref :: < Regex > ( ) {
191
191
Ok ( Edn :: str ( pattern. replace_all ( s, & * * next) . into_owned ( ) ) )
192
192
} else {
193
193
Err ( format ! ( "re-replace-all expected a regex, got {:?}" , p) )
0 commit comments