Skip to content
This repository was archived by the owner on Apr 27, 2022. It is now read-only.

Commit e6866a5

Browse files
committed
rustler relase 0.12.0
1 parent 1723af9 commit e6866a5

File tree

4 files changed

+78
-6
lines changed

4 files changed

+78
-6
lines changed

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@ defmodule ExHtml5ever.Mixfile do
4242
#
4343
# Type "mix help deps" for more examples and options
4444
defp deps do
45-
[{:rustler, github: "hansihe/Rustler", sparse: "rustler_mix"}]
45+
[{:rustler, "~> 0.6"}]
4646
end
4747
end

mix.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
%{"rustler": {:git, "https://github.com/hansihe/Rustler.git", "e8ba21e44523cacb3c8af2ef952c1a9ce0f67727", [sparse: "rustler_mix"]}}
1+
%{"rustler": {:hex, :rustler, "0.6.0", "ba67a5e3d662876f2bf7ef5478bb3be03a7baa40e96950456526fdee29673530", [:mix], []}}

native/html5ever_nif/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ path = "src/lib.rs"
99
crate-type = ["dylib"]
1010

1111
[build-dependencies]
12-
rustler_codegen = { git = "https://github.com/hansihe/Rustler" }
12+
rustler_codegen = "^0.12"
1313

1414
[dependencies]
15-
rustler = { git = "https://github.com/hansihe/Rustler" }
16-
rustler_codegen = { git = "https://github.com/hansihe/Rustler" }
15+
rustler = "^0.12"
16+
rustler_codegen = "^0.12"
1717

1818
html5ever = "*"
1919
tendril = "*"

native/html5ever_nif/src/lib.rs

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,19 @@ use rustler::{
1212
NifEnv,
1313
NifTerm,
1414
NifResult,
15+
NifError,
1516
NifEncoder,
17+
NifDecoder,
1618
};
1719
use rustler::types::binary::NifBinary;
1820
use rustler::env::OwnedEnv;
1921

2022
use html5ever::{ QualName };
2123
use html5ever::rcdom::{ RcDom, Handle, NodeEnum };
24+
use html5ever::driver::ParseOpts;
25+
use html5ever::tokenizer::TokenizerOpts;
26+
use html5ever::tree_builder::TreeBuilderOpts;
27+
use html5ever::tree_builder::interface::QuirksMode;
2228
use tendril::{ TendrilSink, StrTendril };
2329

2430
mod atoms {
@@ -27,10 +33,74 @@ mod atoms {
2733

2834
atom ok;
2935
atom error;
36+
atom nil;
3037
atom nif_panic;
3138

3239
atom doctype;
3340
atom comment;
41+
42+
atom error_level;
43+
atom discard_bom;
44+
atom scripting_enabled;
45+
atom iframe_srcdoc;
46+
atom drop_doctype;
47+
48+
atom none;
49+
atom some;
50+
atom all;
51+
}
52+
}
53+
54+
#[derive(PartialEq, Eq)]
55+
enum ErrorLevel {
56+
None,
57+
Some,
58+
All,
59+
}
60+
impl<'a> NifDecoder<'a> for ErrorLevel {
61+
fn decode(term: NifTerm<'a>) -> NifResult<ErrorLevel> {
62+
if atoms::none() == term { Ok(ErrorLevel::None) }
63+
else if atoms::some() == term { Ok(ErrorLevel::Some) }
64+
else if atoms::all() == term { Ok(ErrorLevel::All) }
65+
else { Err(NifError::BadArg) }
66+
}
67+
}
68+
69+
fn term_to_configs(term: NifTerm) -> NifResult<ParseOpts> {
70+
if atoms::nil() == term {
71+
Ok(ParseOpts::default())
72+
} else {
73+
let env = term.get_env();
74+
75+
let errors: ErrorLevel =
76+
term.map_get(atoms::error_level().to_term(env))?.decode()?;
77+
78+
let discard_bom: bool =
79+
term.map_get(atoms::discard_bom().to_term(env))?.decode()?;
80+
let scripting_enabled: bool =
81+
term.map_get(atoms::scripting_enabled().to_term(env))?.decode()?;
82+
let iframe_srcdoc: bool =
83+
term.map_get(atoms::iframe_srcdoc().to_term(env))?.decode()?;
84+
let drop_doctype: bool =
85+
term.map_get(atoms::drop_doctype().to_term(env))?.decode()?;
86+
87+
Ok(ParseOpts {
88+
tokenizer: TokenizerOpts {
89+
exact_errors: errors == ErrorLevel::All,
90+
discard_bom: discard_bom,
91+
profile: false,
92+
initial_state: None,
93+
last_start_tag_name: None,
94+
},
95+
tree_builder: TreeBuilderOpts {
96+
exact_errors: errors == ErrorLevel::All,
97+
scripting_enabled: scripting_enabled,
98+
iframe_srcdoc: iframe_srcdoc,
99+
drop_doctype: drop_doctype,
100+
ignore_missing_rules: false,
101+
quirks_mode: QuirksMode::NoQuirks,
102+
},
103+
})
34104
}
35105
}
36106

@@ -113,8 +183,10 @@ fn parse_async<'a>(env: NifEnv<'a>, args: &Vec<NifTerm<'a>>) -> NifResult<NifTer
113183

114184
let return_pid = env.pid();
115185

186+
//let config = term_to_configs(args[1]);
187+
116188
POOL.spawn(move || {
117-
owned_env.send(return_pid, |inner_env| {
189+
owned_env.send_and_clear(&return_pid, |inner_env| {
118190
// This should not really be done in user code. We (Rustler project)
119191
// need to find a better abstraction that eliminates this.
120192
match panic::catch_unwind(|| {

0 commit comments

Comments
 (0)