selma 0.0.6-arm64-darwin → 0.1.0-arm64-darwin

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,112 +0,0 @@
1
- use magnus::{exception, function, scan_args, Error, Module, Object, RModule, Value};
2
-
3
- #[derive(Clone, Debug)]
4
- #[magnus::wrap(class = "Selma::Selector")]
5
- pub struct SelmaSelector {
6
- match_element: Option<String>,
7
- match_text_within: Option<String>,
8
- ignore_text_within: Option<Vec<String>>,
9
- }
10
-
11
- impl SelmaSelector {
12
- fn new(args: &[Value]) -> Result<Self, Error> {
13
- let (match_element, match_text_within, rb_ignore_text_within) =
14
- Self::scan_parse_args(args)?;
15
-
16
- if match_element.is_none() && match_text_within.is_none() {
17
- return Err(Error::new(
18
- exception::arg_error(),
19
- "Neither `match_element` nor `match_text_within` option given",
20
- ));
21
- }
22
-
23
- // FIXME: not excited about this double parse work (`element!` does it too),
24
- // but at least we can bail ASAP if the CSS is invalid
25
- if match_element.is_some() {
26
- let css = match_element.as_ref().unwrap();
27
- if css.parse::<lol_html::Selector>().is_err() {
28
- return Err(Error::new(
29
- exception::arg_error(),
30
- format!("Could not parse `match_element` (`{css:?}`) as valid CSS"),
31
- ));
32
- }
33
- }
34
-
35
- if match_text_within.is_some() {
36
- let css = match_text_within.as_ref().unwrap();
37
- if css.parse::<lol_html::Selector>().is_err() {
38
- return Err(Error::new(
39
- exception::arg_error(),
40
- format!("Could not parse `match_text_within` (`{css:?}`) as valid CSS",),
41
- ));
42
- }
43
- }
44
-
45
- let ignore_text_within = match rb_ignore_text_within {
46
- None => None,
47
- Some(rb_ignore_text_within) => {
48
- let mut ignore_text_within = vec![];
49
- rb_ignore_text_within.iter().for_each(|i| {
50
- // TODO: test this against malice
51
- let ignore_text_within_tag_name = i.to_string();
52
- ignore_text_within.push(ignore_text_within_tag_name);
53
- });
54
- Some(ignore_text_within)
55
- }
56
- };
57
-
58
- Ok(Self {
59
- match_element,
60
- match_text_within,
61
- ignore_text_within,
62
- })
63
- }
64
-
65
- #[allow(clippy::let_unit_value)]
66
- fn scan_parse_args(
67
- args: &[Value],
68
- ) -> Result<(Option<String>, Option<String>, Option<Vec<String>>), Error> {
69
- let args = scan_args::scan_args(args)?;
70
- let _: () = args.required;
71
- let _: () = args.optional;
72
- let _: () = args.splat;
73
- let _: () = args.trailing;
74
- let _: () = args.block;
75
-
76
- let kw = scan_args::get_kwargs::<
77
- _,
78
- (),
79
- (Option<String>, Option<String>, Option<Vec<String>>),
80
- (),
81
- >(
82
- args.keywords,
83
- &[],
84
- &["match_element", "match_text_within", "ignore_text_within"],
85
- )?;
86
- let (match_element, match_text_within, rb_ignore_text_within) = kw.optional;
87
-
88
- Ok((match_element, match_text_within, rb_ignore_text_within))
89
- }
90
-
91
- pub fn match_element(&self) -> Option<String> {
92
- self.match_element.clone()
93
- }
94
-
95
- pub fn match_text_within(&self) -> Option<String> {
96
- self.match_text_within.clone()
97
- }
98
-
99
- pub fn ignore_text_within(&self) -> Option<Vec<String>> {
100
- self.ignore_text_within.clone()
101
- }
102
- }
103
-
104
- pub fn init(m_selma: RModule) -> Result<(), Error> {
105
- let c_selector = m_selma
106
- .define_class("Selector", Default::default())
107
- .expect("cannot define class Selma::Selector");
108
-
109
- c_selector.define_singleton_method("new", function!(SelmaSelector::new, -1))?;
110
-
111
- Ok(())
112
- }