Cleanup rust parser

This commit is contained in:
tarsin committed 2023-06-14 11:36:36 +08:00
1 parent 804dffc81a
commit 92b6069654
2 files changed
+13 -13

No files matched your search

@@ -10,7 +10,6 @@ object HomeParser {
fun parse(body: String): Limits {
val value = parseLimit(body)
check(value.size == 3)
if (value[0] == -1) throw ParseException("Parse image limits error", body)
return Limits(value[0], value[1], value[2])
}
+13 -12
View File
@@ -1,26 +1,27 @@
extern crate jni;
extern crate tl;
use jni::JNIEnv;
use jni::objects::{JClass, JString};
use jni::sys::jintArray;
use tl::{Parser, VDom};
fn parse_limit(body: &str) -> Option<Vec<i32>> {
let dom = tl::parse(body, tl::ParserOptions::default()).ok()?;
fn parse_jni_string<F, R>(env: &mut JNIEnv, str: &JString, mut f: F) -> Option<R>
where F: FnMut(&VDom, &Parser) -> Option<R> {
let html = env.get_string(str).ok()?;
let dom = tl::parse(html.to_str().ok()?, tl::ParserOptions::default()).ok()?;
let parser = dom.parser();
let home_box = dom.query_selector("div.homebox")?.next()?.get(parser)?;
let html2 = home_box.inner_html(parser);
let dom2 = tl::parse(&*html2, tl::ParserOptions::default()).ok()?;
let parser = dom2.parser();
let iter = dom2.query_selector("strong")?;
let vec: Vec<i32> = iter.filter_map(|e| Some(e.get(parser)?.inner_text(parser).parse::<i32>().ok()?)).collect();
Some(vec)
Some(f(&dom, parser)?)
}
#[no_mangle]
pub extern "system" fn Java_com_hippo_ehviewer_client_parser_HomeParserKt_parseLimit<'local>(mut env: JNIEnv<'local>, _class: JClass<'local>, input: JString<'local>) -> jintArray {
let html = env.get_string(input.as_ref()).unwrap();
let vec = parse_limit(html.to_str().unwrap());
let vec = parse_jni_string(&mut env, &input, |dom, parser| {
let iter = dom.query_selector("strong")?;
let vec: Vec<i32> = iter.filter_map(|e| Some(e.get(parser)?.inner_text(parser).parse::<i32>().ok()?)).collect();
if vec.len() == 3 { Some(vec) } else { None }
}).unwrap_or(vec![-1, -1, -1]);
let jir = env.new_int_array(3).unwrap();
env.set_int_array_region(&jir, 0, vec.unwrap_or(vec![-1, -1, -1]).as_ref()).unwrap();
env.set_int_array_region(&jir, 0, &vec).unwrap();
jir.into_raw()
}