diff --git a/etws_loader/src/lib.rs b/etws_loader/src/lib.rs index ac6477e..1597171 100644 --- a/etws_loader/src/lib.rs +++ b/etws_loader/src/lib.rs @@ -112,7 +112,7 @@ impl Plugin for ETWSLoader { .into_iter() .map(|p| p as usize) .collect::>(), - datetime: RNone, + datetime: record.filetime.timestamp(), dimensions: RVec::from(vec![RString::from("time")]), coord_type: c, dimension_values: RVec::from( @@ -164,7 +164,7 @@ mod tests { fn test() { let result = - Record::parse_from_path("/Users/ruomu/Documents/ZJSXAA_20230627163200_FR.dat.gz") + Record::parse_from_path("/Volumes/data2/RadarArray/HangZhou/radarData/OutputProducts/RadarProducts/BasicProductsX/20230822/20230822100400/ZJHZAA_20230822100400_CR.dat.gz") .unwrap(); } } diff --git a/etws_loader/src/parser.rs b/etws_loader/src/parser.rs index 79d796c..4ba80b6 100644 --- a/etws_loader/src/parser.rs +++ b/etws_loader/src/parser.rs @@ -1,6 +1,6 @@ use crate::error::ETWSError; use byteorder::{BigEndian, ByteOrder, LittleEndian}; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, NaiveDateTime, Utc}; use flate2::read::GzDecoder; use nom::{ bytes::complete::{tag, take}, @@ -76,13 +76,10 @@ impl Record { let (_, parsed) = Self::_parse(binary_data.as_slice()).map_err(|_| anyhow::Error::msg("Parse error"))?; - Ok(Record { - filetime: Utc::now(), - blocks: parsed, - }) + Ok(parsed) } - fn _parse(binary_data: &[u8]) -> IResult<&[u8], Vec> { + fn _parse(binary_data: &[u8]) -> IResult<&[u8], Record> { let start_tag = b"UNI_DATA"; let (input, _) = tag(start_tag)(binary_data)?; let (input, order) = Self::_parse_split_fn(input, 8, 8, Self::_parse_order)?; @@ -98,11 +95,14 @@ impl Record { Ok((input, p)) })?; - let (input, blocks) = count(Self::_parse_block_fn(order), record_info.block_num as usize)(input)?; - Ok((input, blocks)) + let data_time = + NaiveDateTime::parse_from_str(&record_info.file_time, r"%Y%m%d%H%M%S").unwrap(); + let filetime = data_time.and_utc(); + + Ok((input, Record { filetime, blocks })) } fn _parse_order(input: &[u8]) -> IResult<&[u8], Order> { diff --git a/etws_loader/target/.rustc_info.json b/etws_loader/target/.rustc_info.json index 0d726c4..cdcdbfd 100644 --- a/etws_loader/target/.rustc_info.json +++ b/etws_loader/target/.rustc_info.json @@ -1 +1 @@ -{"rustc_fingerprint":8475780184195034948,"outputs":{"4614504638168534921":{"success":true,"status":"","code":0,"stdout":"rustc 1.74.0-nightly (8142a319e 2023-09-13)\nbinary: rustc\ncommit-hash: 8142a319ed5c1d1f96e5a1881a6546e463b77c8f\ncommit-date: 2023-09-13\nhost: x86_64-apple-darwin\nrelease: 1.74.0-nightly\nLLVM version: 17.0.0\n","stderr":""},"15729799797837862367":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/ruomu/.rustup/toolchains/nightly-x86_64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\noverflow_checks\npanic=\"unwind\"\nproc_macro\nrelocation_model=\"pic\"\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_feature=\"ssse3\"\ntarget_has_atomic\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_equal_alignment=\"16\"\ntarget_has_atomic_equal_alignment=\"32\"\ntarget_has_atomic_equal_alignment=\"64\"\ntarget_has_atomic_equal_alignment=\"8\"\ntarget_has_atomic_equal_alignment=\"ptr\"\ntarget_has_atomic_load_store\ntarget_has_atomic_load_store=\"128\"\ntarget_has_atomic_load_store=\"16\"\ntarget_has_atomic_load_store=\"32\"\ntarget_has_atomic_load_store=\"64\"\ntarget_has_atomic_load_store=\"8\"\ntarget_has_atomic_load_store=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_thread_local\ntarget_vendor=\"apple\"\nunix\n","stderr":""}},"successes":{}} \ No newline at end of file +{"rustc_fingerprint":6534886339914138005,"outputs":{"15729799797837862367":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/tsuki/.rustup/toolchains/nightly-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\noverflow_checks\npanic=\"unwind\"\nproc_macro\nrelocation_model=\"pic\"\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"aes\"\ntarget_feature=\"crc\"\ntarget_feature=\"dit\"\ntarget_feature=\"dotprod\"\ntarget_feature=\"dpb\"\ntarget_feature=\"dpb2\"\ntarget_feature=\"fcma\"\ntarget_feature=\"fhm\"\ntarget_feature=\"flagm\"\ntarget_feature=\"fp16\"\ntarget_feature=\"frintts\"\ntarget_feature=\"jsconv\"\ntarget_feature=\"lor\"\ntarget_feature=\"lse\"\ntarget_feature=\"neon\"\ntarget_feature=\"paca\"\ntarget_feature=\"pacg\"\ntarget_feature=\"pan\"\ntarget_feature=\"pmuv3\"\ntarget_feature=\"ras\"\ntarget_feature=\"rcpc\"\ntarget_feature=\"rcpc2\"\ntarget_feature=\"rdm\"\ntarget_feature=\"sb\"\ntarget_feature=\"sha2\"\ntarget_feature=\"sha3\"\ntarget_feature=\"ssbs\"\ntarget_feature=\"v8.1a\"\ntarget_feature=\"v8.2a\"\ntarget_feature=\"v8.3a\"\ntarget_feature=\"v8.4a\"\ntarget_feature=\"vh\"\ntarget_has_atomic\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_equal_alignment=\"128\"\ntarget_has_atomic_equal_alignment=\"16\"\ntarget_has_atomic_equal_alignment=\"32\"\ntarget_has_atomic_equal_alignment=\"64\"\ntarget_has_atomic_equal_alignment=\"8\"\ntarget_has_atomic_equal_alignment=\"ptr\"\ntarget_has_atomic_load_store\ntarget_has_atomic_load_store=\"128\"\ntarget_has_atomic_load_store=\"16\"\ntarget_has_atomic_load_store=\"32\"\ntarget_has_atomic_load_store=\"64\"\ntarget_has_atomic_load_store=\"8\"\ntarget_has_atomic_load_store=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_thread_local\ntarget_vendor=\"apple\"\nunix\n","stderr":""},"4614504638168534921":{"success":true,"status":"","code":0,"stdout":"rustc 1.77.0-nightly (d78329b92 2024-01-13)\nbinary: rustc\ncommit-hash: d78329b92e8d141d19505e7c1527181c4ab87ed4\ncommit-date: 2024-01-13\nhost: aarch64-apple-darwin\nrelease: 1.77.0-nightly\nLLVM version: 17.0.6\n","stderr":""}},"successes":{}} \ No newline at end of file diff --git a/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader b/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader index e69de29..fdc6dcb 100644 --- a/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader +++ b/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader @@ -0,0 +1 @@ +7f880159c4128aff \ No newline at end of file diff --git a/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json b/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json index a477e14..0a17fa6 100644 --- a/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json +++ b/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json @@ -1 +1 @@ -{"rustc":2034204546556879275,"features":"[]","target":8454914719411586997,"profile":237655285757591511,"path":17523903030608720598,"deps":[[3470807962260834726,"serde",false,2576951082755195512],[6147374319788932929,"serde_json",false,11236813085233191832],[6644485573429891122,"thiserror",false,5126029546610645633],[6954241390595330609,"nom",false,14594257645800348529],[8926101378076943148,"byteorder",false,6152224339654054050],[8944703748776155531,"chrono",false,2759878786481602857],[10043922549268360936,"radarg_plugin_interface",false,8711709271969384688],[11138931377059941435,"num_traits",false,12000539450629646242],[12701726091060201577,"abi_stable",false,2020347370461875638],[12732307821348191974,"anyhow",false,6665578769121370250],[12935855096716563853,"flate2",false,1415421899538952416],[16098302879908240583,"nom_derive",false,5995471445394779106]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/etws_loader-826e392dbec97b5d/dep-lib-etws_loader"}}],"rustflags":[],"metadata":41698518999418921,"config":2202906307356721367,"compile_kind":0} \ No newline at end of file +{"rustc":17942353898403517573,"features":"[]","declared_features":"","target":8454914719411586997,"profile":14453530908159220714,"path":17523903030608720598,"deps":[[3470807962260834726,"serde",false,5495292221209974483],[6147374319788932929,"serde_json",false,17629184298793602400],[6644485573429891122,"thiserror",false,10413949152335566531],[6954241390595330609,"nom",false,9344036846249977496],[8926101378076943148,"byteorder",false,10139374136197577960],[8944703748776155531,"chrono",false,16322245435054934110],[10043922549268360936,"radarg_plugin_interface",false,16692653198501731083],[11138931377059941435,"num_traits",false,6726096067911681083],[12701726091060201577,"abi_stable",false,8790379237487676272],[12732307821348191974,"anyhow",false,17882246209481609850],[12935855096716563853,"flate2",false,425247165075559516],[16098302879908240583,"nom_derive",false,14241727609982393563]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/etws_loader-826e392dbec97b5d/dep-lib-etws_loader"}}],"rustflags":[],"metadata":41698518999418921,"config":2202906307356721367,"compile_kind":0} \ No newline at end of file diff --git a/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader b/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader index f8b5ae5..71873be 100644 --- a/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader +++ b/etws_loader/target/debug/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader @@ -1,5 +1,7 @@ -{"message":"unused imports: `Write`, `self`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":308,"byte_end":312,"line_start":13,"line_end":13,"column_start":15,"column_end":19,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":19}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":320,"byte_end":325,"line_start":13,"line_end":13,"column_start":27,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":27,"highlight_end":32}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the unused imports","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":308,"byte_end":314,"line_start":13,"line_end":13,"column_start":15,"column_end":21,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":21}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null},{"file_name":"src/parser.rs","byte_start":318,"byte_end":325,"line_start":13,"line_end":13,"column_start":25,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":25,"highlight_end":32}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused imports: `Write`, `self`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:13:15\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m13\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0muse std::io::{self, Read, Write};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"} -{"message":"unused import: `external_types::crossbeam_channel::RSender`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":69,"byte_end":111,"line_start":5,"line_end":5,"column_start":5,"column_end":47,"is_primary":true,"text":[{"text":" external_types::crossbeam_channel::RSender,","highlight_start":5,"highlight_end":47}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":63,"byte_end":111,"line_start":4,"line_end":5,"column_start":23,"column_end":47,"is_primary":true,"text":[{"text":" export_root_module,","highlight_start":23,"highlight_end":24},{"text":" external_types::crossbeam_channel::RSender,","highlight_start":1,"highlight_end":47}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `external_types::crossbeam_channel::RSender`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:5:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m5\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m external_types::crossbeam_channel::RSender,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\n"} -{"message":"unused variable: `hlen2`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":4460,"byte_end":4465,"line_start":153,"line_end":153,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_variables)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":4460,"byte_end":4465,"line_start":153,"line_end":153,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":"_hlen2","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:153:21\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m153\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (input, hlen2) = Self::_parse_u32(input, order)?;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` on by default\u001b[0m\n\n"} -{"message":"unused variable: `order`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":6453,"byte_end":6458,"line_start":221,"line_end":221,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":6453,"byte_end":6458,"line_start":221,"line_end":221,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":"_order","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `order`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:221:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m221\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m order: Order,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_order`\u001b[0m\n\n"} -{"message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1056,"byte_end":1069,"line_start":42,"line_end":42,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1056,"byte_end":1069,"line_start":42,"line_end":42,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:42:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m42\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused imports: `Write`, `self`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":308,"byte_end":312,"line_start":13,"line_end":13,"column_start":15,"column_end":19,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":19}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":320,"byte_end":325,"line_start":13,"line_end":13,"column_start":27,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":27,"highlight_end":32}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the unused imports","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":308,"byte_end":314,"line_start":13,"line_end":13,"column_start":15,"column_end":21,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":21}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null},{"file_name":"src/parser.rs","byte_start":318,"byte_end":325,"line_start":13,"line_end":13,"column_start":25,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":25,"highlight_end":32}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused imports: `Write`, `self`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:13:15\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m13\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0muse std::io::{self, Read, Write};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused import: `RNone`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":180,"byte_end":185,"line_start":9,"line_end":9,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" RNone, ROk,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":180,"byte_end":187,"line_start":9,"line_end":9,"column_start":9,"column_end":16,"is_primary":true,"text":[{"text":" RNone, ROk,","highlight_start":9,"highlight_end":16}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `RNone`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:9:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m9\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m RNone, ROk,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused variable: `hlen2`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":4545,"byte_end":4550,"line_start":155,"line_end":155,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_variables)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":4545,"byte_end":4550,"line_start":155,"line_end":155,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":"_hlen2","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:155:21\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m155\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (input, hlen2) = Self::_parse_u32(input, order)?;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` on by default\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused variable: `order`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":6538,"byte_end":6543,"line_start":223,"line_end":223,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":6538,"byte_end":6543,"line_start":223,"line_end":223,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":"_order","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `order`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:223:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m223\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m order: Order,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_order`\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:41:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m41\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"variants `I64` and `U64` are never constructed","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":529,"byte_end":539,"line_start":27,"line_end":27,"column_start":6,"column_end":16,"is_primary":false,"text":[{"text":"enum ValueTypes {","highlight_start":6,"highlight_end":16}],"label":"variants in this enum","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":546,"byte_end":549,"line_start":28,"line_end":28,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" I64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":582,"byte_end":585,"line_start":32,"line_end":32,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" U64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(dead_code)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: variants `I64` and `U64` are never constructed\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:28:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m27\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0menum ValueTypes {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m----------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mvariants in this enum\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m28\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m I64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m...\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m32\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m U64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` on by default\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"6 warnings emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: 6 warnings emitted\u001b[0m\n\n"} diff --git a/etws_loader/target/debug/deps/etws_loader.d b/etws_loader/target/debug/deps/etws_loader.d index f0f8231..15894f7 100644 --- a/etws_loader/target/debug/deps/etws_loader.d +++ b/etws_loader/target/debug/deps/etws_loader.d @@ -1,8 +1,8 @@ -/Users/ruomu/projects/cinrad_g/etws_loader/target/debug/deps/libetws_loader.dylib: src/lib.rs src/error.rs src/parser.rs +/Users/tsuki/projects/radar-g/etws_loader/target/debug/deps/libetws_loader.dylib: src/lib.rs src/error.rs src/parser.rs -/Users/ruomu/projects/cinrad_g/etws_loader/target/debug/deps/libetws_loader.rlib: src/lib.rs src/error.rs src/parser.rs +/Users/tsuki/projects/radar-g/etws_loader/target/debug/deps/libetws_loader.rlib: src/lib.rs src/error.rs src/parser.rs -/Users/ruomu/projects/cinrad_g/etws_loader/target/debug/deps/etws_loader.d: src/lib.rs src/error.rs src/parser.rs +/Users/tsuki/projects/radar-g/etws_loader/target/debug/deps/etws_loader.d: src/lib.rs src/error.rs src/parser.rs src/lib.rs: src/error.rs: diff --git a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader index b9b1390..928d854 100644 --- a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader +++ b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader @@ -1 +1 @@ -747a3e56d0023d1f \ No newline at end of file +16f3840281ed1c0f \ No newline at end of file diff --git a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json index 2a14595..2d45bde 100644 --- a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json +++ b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json @@ -1 +1 @@ -{"rustc":2034204546556879275,"features":"[]","target":8454914719411586997,"profile":3567329628440936607,"path":17523903030608720598,"deps":[[3470807962260834726,"serde",false,4787662401497216020],[6147374319788932929,"serde_json",false,13625016085015906423],[6644485573429891122,"thiserror",false,1778660508903088478],[6954241390595330609,"nom",false,2941494162337318825],[8926101378076943148,"byteorder",false,13786993926510157100],[8944703748776155531,"chrono",false,9456401766367467294],[10043922549268360936,"radarg_plugin_interface",false,11802334733291555594],[11138931377059941435,"num_traits",false,2532219253751132008],[12701726091060201577,"abi_stable",false,2027217686562626457],[12732307821348191974,"anyhow",false,10525944046939466143],[12935855096716563853,"flate2",false,6751665531550146114],[16098302879908240583,"nom_derive",false,13622616610426096756]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/etws_loader-826e392dbec97b5d/dep-lib-etws_loader"}}],"rustflags":[],"metadata":41698518999418921,"config":2202906307356721367,"compile_kind":0} \ No newline at end of file +{"rustc":17942353898403517573,"features":"[]","declared_features":"","target":8454914719411586997,"profile":14094339167972473758,"path":17523903030608720598,"deps":[[3470807962260834726,"serde",false,3464438898850424389],[6147374319788932929,"serde_json",false,4018346002534341099],[6644485573429891122,"thiserror",false,15376366722783231122],[6954241390595330609,"nom",false,17004332135801955629],[8926101378076943148,"byteorder",false,6029042559770906212],[8944703748776155531,"chrono",false,14085117952510397354],[10043922549268360936,"radarg_plugin_interface",false,2929903515477199145],[11138931377059941435,"num_traits",false,16208028648554347177],[12701726091060201577,"abi_stable",false,46919867052192855],[12732307821348191974,"anyhow",false,13132421988549874417],[12935855096716563853,"flate2",false,9880693184163145737],[16098302879908240583,"nom_derive",false,9783335926581460414]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/etws_loader-826e392dbec97b5d/dep-lib-etws_loader"}}],"rustflags":[],"metadata":41698518999418921,"config":2202906307356721367,"compile_kind":0} \ No newline at end of file diff --git a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader index a4e99ab..e694fca 100644 --- a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader +++ b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader @@ -1,6 +1,7 @@ -{"message":"unused imports: `Write`, `self`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":308,"byte_end":312,"line_start":13,"line_end":13,"column_start":15,"column_end":19,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":19}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":320,"byte_end":325,"line_start":13,"line_end":13,"column_start":27,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":27,"highlight_end":32}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the unused imports","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":308,"byte_end":314,"line_start":13,"line_end":13,"column_start":15,"column_end":21,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":21}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null},{"file_name":"src/parser.rs","byte_start":318,"byte_end":325,"line_start":13,"line_end":13,"column_start":25,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":25,"highlight_end":32}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused imports: `Write`, `self`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:13:15\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m13\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0muse std::io::{self, Read, Write};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"} -{"message":"unused variable: `hlen2`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":4460,"byte_end":4465,"line_start":153,"line_end":153,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_variables)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":4460,"byte_end":4465,"line_start":153,"line_end":153,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":"_hlen2","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:153:21\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m153\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (input, hlen2) = Self::_parse_u32(input, order)?;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` on by default\u001b[0m\n\n"} -{"message":"unused variable: `order`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":6453,"byte_end":6458,"line_start":221,"line_end":221,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":6453,"byte_end":6458,"line_start":221,"line_end":221,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":"_order","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `order`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:221:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m221\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m order: Order,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_order`\u001b[0m\n\n"} -{"message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:41:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m41\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"} -{"message":"variants `I64` and `U64` are never constructed","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":529,"byte_end":539,"line_start":27,"line_end":27,"column_start":6,"column_end":16,"is_primary":false,"text":[{"text":"enum ValueTypes {","highlight_start":6,"highlight_end":16}],"label":"variants in this enum","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":546,"byte_end":549,"line_start":28,"line_end":28,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" I64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":582,"byte_end":585,"line_start":32,"line_end":32,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" U64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(dead_code)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: variants `I64` and `U64` are never constructed\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:28:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m27\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0menum ValueTypes {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m----------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mvariants in this enum\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m28\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m I64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m...\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m32\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m U64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` on by default\u001b[0m\n\n"} -{"message":"5 warnings emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: 5 warnings emitted\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused imports: `Write`, `self`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":327,"line_start":13,"line_end":13,"column_start":15,"column_end":19,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":19}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":335,"byte_end":340,"line_start":13,"line_end":13,"column_start":27,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":27,"highlight_end":32}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the unused imports","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":329,"line_start":13,"line_end":13,"column_start":15,"column_end":21,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":21}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null},{"file_name":"src/parser.rs","byte_start":333,"byte_end":340,"line_start":13,"line_end":13,"column_start":25,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":25,"highlight_end":32}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused imports: `Write`, `self`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:13:15\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m13\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0muse std::io::{self, Read, Write};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused import: `RNone`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":180,"byte_end":185,"line_start":9,"line_end":9,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" RNone, ROk,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":180,"byte_end":187,"line_start":9,"line_end":9,"column_start":9,"column_end":16,"is_primary":true,"text":[{"text":" RNone, ROk,","highlight_start":9,"highlight_end":16}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `RNone`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:9:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m9\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m RNone, ROk,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused variable: `hlen2`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":4573,"byte_end":4578,"line_start":153,"line_end":153,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_variables)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":4573,"byte_end":4578,"line_start":153,"line_end":153,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":"_hlen2","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:153:21\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m153\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (input, hlen2) = Self::_parse_u32(input, order)?;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` on by default\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused variable: `order`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":6566,"byte_end":6571,"line_start":221,"line_end":221,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":6566,"byte_end":6571,"line_start":221,"line_end":221,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":"_order","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `order`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:221:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m221\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m order: Order,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_order`\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:41:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m41\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"variants `I64` and `U64` are never constructed","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":544,"byte_end":554,"line_start":27,"line_end":27,"column_start":6,"column_end":16,"is_primary":false,"text":[{"text":"enum ValueTypes {","highlight_start":6,"highlight_end":16}],"label":"variants in this enum","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":561,"byte_end":564,"line_start":28,"line_end":28,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" I64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":597,"byte_end":600,"line_start":32,"line_end":32,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" U64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(dead_code)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: variants `I64` and `U64` are never constructed\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:28:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m27\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0menum ValueTypes {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m----------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mvariants in this enum\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m28\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m I64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m...\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m32\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m U64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` on by default\u001b[0m\n\n"} +{"$message_type":"diagnostic","message":"6 warnings emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: 6 warnings emitted\u001b[0m\n\n"} diff --git a/etws_loader/target/release/deps/etws_loader.d b/etws_loader/target/release/deps/etws_loader.d index aa4f077..2025c0d 100644 --- a/etws_loader/target/release/deps/etws_loader.d +++ b/etws_loader/target/release/deps/etws_loader.d @@ -1,8 +1,8 @@ -/Users/ruomu/projects/cinrad_g/etws_loader/target/release/deps/libetws_loader.dylib: src/lib.rs src/error.rs src/parser.rs +/Users/tsuki/projects/radar-g/etws_loader/target/release/deps/libetws_loader.dylib: src/lib.rs src/error.rs src/parser.rs -/Users/ruomu/projects/cinrad_g/etws_loader/target/release/deps/libetws_loader.rlib: src/lib.rs src/error.rs src/parser.rs +/Users/tsuki/projects/radar-g/etws_loader/target/release/deps/libetws_loader.rlib: src/lib.rs src/error.rs src/parser.rs -/Users/ruomu/projects/cinrad_g/etws_loader/target/release/deps/etws_loader.d: src/lib.rs src/error.rs src/parser.rs +/Users/tsuki/projects/radar-g/etws_loader/target/release/deps/etws_loader.d: src/lib.rs src/error.rs src/parser.rs src/lib.rs: src/error.rs: diff --git a/etws_loader/target/release/deps/libetws_loader.dylib b/etws_loader/target/release/deps/libetws_loader.dylib index ab9526d..fcd8bb5 100755 Binary files a/etws_loader/target/release/deps/libetws_loader.dylib and b/etws_loader/target/release/deps/libetws_loader.dylib differ diff --git a/etws_loader/target/release/deps/libetws_loader.rlib b/etws_loader/target/release/deps/libetws_loader.rlib index af83240..3dad0f6 100644 Binary files a/etws_loader/target/release/deps/libetws_loader.rlib and b/etws_loader/target/release/deps/libetws_loader.rlib differ diff --git a/etws_loader/target/release/libetws_loader.d b/etws_loader/target/release/libetws_loader.d index 40adfb4..77c9b50 100644 --- a/etws_loader/target/release/libetws_loader.d +++ b/etws_loader/target/release/libetws_loader.d @@ -1 +1 @@ -/Users/ruomu/projects/cinrad_g/etws_loader/target/release/libetws_loader.dylib: /Users/ruomu/projects/cinrad_g/etws_loader/src/error.rs /Users/ruomu/projects/cinrad_g/etws_loader/src/lib.rs /Users/ruomu/projects/cinrad_g/etws_loader/src/parser.rs /Users/ruomu/projects/cinrad_g/radarg_plugin_interface/src/error.rs /Users/ruomu/projects/cinrad_g/radarg_plugin_interface/src/lib.rs +/Users/tsuki/projects/radar-g/etws_loader/target/release/libetws_loader.dylib: /Users/tsuki/projects/radar-g/etws_loader/src/error.rs /Users/tsuki/projects/radar-g/etws_loader/src/lib.rs /Users/tsuki/projects/radar-g/etws_loader/src/parser.rs /Users/tsuki/projects/radar-g/radarg_plugin_interface/src/error.rs /Users/tsuki/projects/radar-g/radarg_plugin_interface/src/lib.rs diff --git a/etws_loader/target/release/libetws_loader.dylib b/etws_loader/target/release/libetws_loader.dylib index ab9526d..fcd8bb5 100755 Binary files a/etws_loader/target/release/libetws_loader.dylib and b/etws_loader/target/release/libetws_loader.dylib differ diff --git a/etws_loader/target/release/libetws_loader.rlib b/etws_loader/target/release/libetws_loader.rlib index af83240..3dad0f6 100644 Binary files a/etws_loader/target/release/libetws_loader.rlib and b/etws_loader/target/release/libetws_loader.rlib differ diff --git a/radarg_plugin_interface/src/lib.rs b/radarg_plugin_interface/src/lib.rs index 8a01359..fcf05be 100644 --- a/radarg_plugin_interface/src/lib.rs +++ b/radarg_plugin_interface/src/lib.rs @@ -95,7 +95,7 @@ pub struct Block { pub shape: DataShape, pub size: RVec, pub coord_type: CoordType, - pub datetime: ROption, + pub datetime: i64, pub dimensions: RVec, pub dimension_values: RVec>, pub fill_value: f64, diff --git a/src/components/app.rs b/src/components/app.rs index 9fb8100..64aee58 100644 --- a/src/components/app.rs +++ b/src/components/app.rs @@ -1,7 +1,9 @@ use crate::{ coords::{proj::Mercator, Mapper}, data::{self, CoordType, Radar2d}, + errors::RenderError, pipeline::{ + self, offscreen_renderer::OffscreenRenderer, pool::Pool, render_pipeline::RenderResult, @@ -24,10 +26,11 @@ use super::{ messages::MonitorInputMsg, monitor::MonitorModel, setting::SettingModel, - TimelineMsg, + ControlPanelOutputMsg, TimelineMsg, }; use abi_stable::std_types::RStr; -use chrono::{DateTime, Duration, Utc}; +use chrono::{prelude::*, DateTime, Duration, Utc}; +use futures::future::{try_join_all, BoxFuture}; use gtk::{ prelude::{ApplicationExt, BoxExt, GtkWindowExt, WidgetExt}, traits::OrientableExt, @@ -40,6 +43,7 @@ use relm4::{gtk, Component, ComponentParts, ComponentSender, RelmWidgetExt, Simp use relm4_components::open_dialog::{ OpenDialog, OpenDialogMsg, OpenDialogResponse, OpenDialogSettings, }; +use smallvec::SmallVec; relm4::new_action_group!(FileActionGroup, "file"); relm4::new_stateless_action!(OpenAction, FileActionGroup, "open"); @@ -51,10 +55,12 @@ pub enum AppMsg { OpenDialog, OpenDialogMulti, OpenFile((DateTime, Layer)), + CheckTo((String, DateTime)), } pub struct AppModel { dispatcher: Arc>, + buffer: SmallVec<[RenderResult; 20]>, open_dialog: Controller, control: Controller, target_pipeline: HashMap, @@ -64,7 +70,7 @@ pub struct AppModel { #[derive(Debug)] pub enum AppCommand { - Prepare, + PrepareFinished(Vec>), } #[relm4::component(pub)] @@ -135,9 +141,12 @@ impl Component for AppModel { root: &Self::Root, sender: ComponentSender, ) -> ComponentParts { - let control = ControlPanelModel::builder() - .launch(0) - .forward(sender.input_sender(), |msg| AppMsg::Close); + let control = ControlPanelModel::builder().launch(0).forward( + sender.input_sender(), + |msg| match msg { + ControlPanelOutputMsg::OpenFile((key, time)) => AppMsg::CheckTo((key, time)), + }, + ); let render = MonitorModel::builder() .launch(()) @@ -169,11 +178,12 @@ impl Component for AppModel { path_format.insert( format!("DBZ"), - format!("/Volumes/data2/RadarArray/HangZhou/radarData/OutputProducts/RadarProducts/BasicProductsX/%Y%m%d/%Y%m%d%H%M%S"), + format!("/Volumes/data2/RadarArray/HangZhou/radarData/OutputProducts/RadarProducts/BasicProductsX/%Y%m%d/%Y%m%d%H%M%S/ZJHZAA_%Y%m%d%H%M%S_ET.dat.gz"), ); dispatcher.set_path_format(path_format); let model = AppModel { + buffer: SmallVec::new(), dispatcher: Arc::new(Mutex::new(dispatcher)), open_dialog: dialog, target_pipeline: HashMap::new(), @@ -228,15 +238,21 @@ impl Component for AppModel { fn update(&mut self, msg: Self::Input, _sender: ComponentSender, root: &Self::Root) { match msg { AppMsg::OpenFile((time, layer)) => { - self.dispatcher.lock().unwrap().set_current_time(time); if !self.target_pipeline.contains_key(&layer.name) { let mut pipeline = Pipeline::new(10, layer.name.clone()); pipeline.set_dispatcher(self.dispatcher.clone()); self.target_pipeline.insert(layer.name.clone(), pipeline); } - let mut pipeline = self.target_pipeline.get_mut(&layer.name).unwrap(); - pipeline.set_current(time, true); - + let pipeline = { + let pipeline = self.target_pipeline.get_mut(&layer.name).unwrap(); + pipeline.set_current(time, true); + pipeline + }; + let worker = Pipeline::run(pipeline); + _sender.oneshot_command(async move { + let results = worker.await; + AppCommand::PrepareFinished(results) + }); self.render.sender().emit(MonitorInputMsg::AddLayer(layer)); self.control .sender() @@ -252,9 +268,75 @@ impl Component for AppModel { AppMsg::OpenDialog => { self.open_dialog.emit(OpenDialogMsg::Open); } + AppMsg::CheckTo((key, datetime)) => { + use std::iter::Iterator; + println!("check to: {}", datetime); + let layer = self + .buffer + .iter() + .position(|r: &RenderResult| r.time() == datetime); + print!("layer: {:?}\n", layer); + for r in self.buffer.iter() { + print!("{} ", r.time()); + } + if let Some(layer) = layer { + let layer = self.buffer.get(layer).unwrap().clone(); + self.render.sender().emit(MonitorInputMsg::RemoveLayer(0)); + self.render + .sender() + .emit(MonitorInputMsg::AddLayer(layer.layer)); + } + } AppMsg::OpenDialogMulti => {} } } + + fn update_cmd_with_view( + &mut self, + widgets: &mut Self::Widgets, + message: Self::CommandOutput, + sender: ComponentSender, + root: &Self::Root, + ) { + match message { + AppCommand::PrepareFinished(mut v) => { + let sorted = v.sort_by_key(|r| { + if let Ok(result) = r.as_ref() { + result.timestamp() + } else { + 0 + } + }); + let v = v.into_iter().filter(|p| p.is_ok()).map(|p| p.unwrap()); + self.buffer.extend(v); + println!("buffer size: {}", self.buffer.len()); + + let thumbs = self + .buffer + .iter() + .map(|r| { + let datetime = r.time(); + let layer = r.layer.clone(); + + let c = { + let layer = layer.render_target(); + let target = layer.lock().unwrap(); + let c = target.as_ref().map(|p| p.thumbnail.clone()).flatten(); + c + }; + + (c, datetime) + }) + .collect::>(); + + for i in self.buffer.iter() { + println!("{} ", i.time()); + } + + self.control.emit(ControlPanelInputMsg::SetThumb(thumbs)) + } + } + } } macro_rules! match_in_macro { @@ -263,9 +345,10 @@ macro_rules! match_in_macro { match $block.data_type { $( $branch => { + let datetime = Utc.timestamp_opt($block.datetime,0).unwrap(); let data: $t = $block.into(); let layer = Layer::grid_render_layer(data, format!($name), $color); - AppMsg::OpenFile((Utc::now() ,layer)) + AppMsg::OpenFile((datetime ,layer)) }, )+ _ => AppMsg::Close, diff --git a/src/components/control_panel/control_panel.rs b/src/components/control_panel/control_panel.rs index 3f315c2..765f64f 100644 --- a/src/components/control_panel/control_panel.rs +++ b/src/components/control_panel/control_panel.rs @@ -170,6 +170,7 @@ impl SimpleComponent for ControlPanelModel { gtk::ScrolledWindow{ set_height_request: 75, + set_max_content_height: 75, #[local_ref] my_view -> gtk::ListView{ add_css_class: "lv", @@ -238,13 +239,31 @@ impl SimpleComponent for ControlPanelModel { ControlPanelInputMsg::SelectionRewind => { let current = self.get_selection().clone(); if let Some(current) = current { - self.set_selection(Some(current - Duration::minutes(12))); + self.set_selection(Some(current - Duration::minutes(1))); + _sender.output(ControlPanelOutputMsg::OpenFile(( + format!("DBZ"), + current - Duration::minutes(1), + ))); } } ControlPanelInputMsg::SelectionFastForward => { let current = self.get_selection().clone(); if let Some(current) = current { - self.set_selection(Some(current + Duration::minutes(12))); + self.set_selection(Some(current + Duration::minutes(1))); + _sender.output(ControlPanelOutputMsg::OpenFile(( + format!("DBZ"), + current + Duration::minutes(1), + ))); + } + } + + ControlPanelInputMsg::SetThumb(v) => { + for (texture, t) in v { + self.list_img_wrapper.append(ImgItem { + time: t.to_string(), + img: texture, + visiable: true, + }); } } } @@ -282,6 +301,8 @@ impl RelmListItem for ImgItem { set_width_request: 100, gtk::Box{ set_margin_all:2, + set_hexpand:true, + set_vexpand:true, #[name = "img"] gtk::Image{} } @@ -293,5 +314,6 @@ impl RelmListItem for ImgItem { fn bind(&mut self, widgets: &mut Self::Widgets, _root: &mut Self::Root) { let Widgets { img } = widgets; + img.set_paintable(self.img.as_ref()); } } diff --git a/src/components/control_panel/messages.rs b/src/components/control_panel/messages.rs index 080025d..d9177fc 100644 --- a/src/components/control_panel/messages.rs +++ b/src/components/control_panel/messages.rs @@ -11,9 +11,12 @@ pub enum TimelineMsg { pub enum ControlPanelInputMsg { TimeLine(TimelineMsg), Selection(Option>), + SetThumb(Vec<(Option, DateTime)>), SelectionRewind, SelectionFastForward, } #[derive(Debug)] -pub enum ControlPanelOutputMsg {} +pub enum ControlPanelOutputMsg { + OpenFile((String, DateTime)), +} diff --git a/src/components/monitor/monitor.rs b/src/components/monitor/monitor.rs index 535846d..f0ab70e 100644 --- a/src/components/monitor/monitor.rs +++ b/src/components/monitor/monitor.rs @@ -93,41 +93,44 @@ impl Component for MonitorModel { match message { MonitorInputMsg::AddLayer(layer) => { // let mut canvas = OFFSCREEN.lock().unwrap(); - sender.oneshot_command(async move { - let mut back = OffscreenRenderer::new(3000, 3000).unwrap(); - let canvas = back.create_canvas(); - // let new_canvas = OffscreenRenderer::new().unwrap(); - let f = { - let p = layer.get_prepare(); - let mut _p = p.lock().unwrap(); - _p.take() - }; - let target = if let Some(f) = f { - let imp = layer.get_imp().unwrap(); + if layer.get_imp().is_some() { + sender.oneshot_command(async move { + let mut back = OffscreenRenderer::new(3000, 3000).unwrap(); + let canvas = back.create_canvas(); + // let new_canvas = OffscreenRenderer::new().unwrap(); + let f = { + let p = layer.get_prepare(); + let mut _p = p.lock().unwrap(); + _p.take() + }; + let target = if let Some(f) = f { + let imp = layer.get_imp().unwrap(); - let map: Mapper = Mercator::default().into(); - let cms = CMS::new(map, (3000.0, 3000.0)); - let canvas = Arc::new(Mutex::new(canvas)); - let c = f(imp, canvas, cms).await; - Some(c) - } else { - None - }; + let map: Mapper = Mercator::default().into(); + let cms = CMS::new(map, (3000.0, 3000.0)); + let canvas = Arc::new(Mutex::new(canvas)); + let c = f(imp, canvas, cms); + Some(c) + } else { + None + }; - if let Some(target) = target { - layer.set_render_target(target); - } - MonitorCommand::NewLayer(layer) - }); + if let Some(target) = target { + layer.set_render_target(target); + } + MonitorCommand::NewLayer(layer) + }); + } else { + self.layers.push(layer); + sender + .output_sender() + .send(MonitorOutputMsg::LayerAdded(0)) + .unwrap(); - sender - .output_sender() - .send(MonitorOutputMsg::LayerAdded(0)) - .unwrap(); - - self.sidebar - .sender() - .send(Msg::RefreshList(self.layers.clone())); + self.sidebar + .sender() + .send(Msg::RefreshList(self.layers.clone())); + } } MonitorInputMsg::RemoveLayer(index) => { self.layers.remove(index); diff --git a/src/pipeline/offscreen_renderer.rs b/src/pipeline/offscreen_renderer.rs index 286d336..e9e959d 100644 --- a/src/pipeline/offscreen_renderer.rs +++ b/src/pipeline/offscreen_renderer.rs @@ -1,3 +1,5 @@ +use crate::widgets::Target; + use super::utils::*; use euclid::Size2D; use femtovg::{renderer::OpenGl, Canvas}; @@ -99,6 +101,8 @@ impl OffscreenRenderer { CanvasWrapper::new(canvas) } + pub fn get_img(&self, target: Target) {} + pub fn get_mem_img(&self) -> Vec { let (w, h) = self.size; let mut pixels: Vec = vec![0; w as usize * h as usize * 4]; @@ -126,6 +130,7 @@ impl Drop for OffscreenRenderer { let mut context = self.context.write().unwrap(); self.device.destroy_context(&mut context).unwrap(); let _ = self; + println!("OffscreenRenderer dropped"); } } diff --git a/src/pipeline/pool.rs b/src/pipeline/pool.rs index 45e7ff3..a79574a 100644 --- a/src/pipeline/pool.rs +++ b/src/pipeline/pool.rs @@ -4,13 +4,19 @@ use std::collections::VecDeque; type PResult = Result; -pub struct Pool { +pub struct Pool +where + T: Send + Sync, +{ items: VecDeque<(i64, T)>, current: Option<(i64, usize)>, len: usize, } -impl Pool { +impl Pool +where + T: Send + Sync, +{ pub fn new(len: usize) -> Self { Pool { items: VecDeque::new(), diff --git a/src/pipeline/render_pipeline.rs b/src/pipeline/render_pipeline.rs index fb10901..18f0f05 100644 --- a/src/pipeline/render_pipeline.rs +++ b/src/pipeline/render_pipeline.rs @@ -2,37 +2,36 @@ use chrono::prelude::*; use femtovg::{renderer::OpenGl, Canvas, ImageId}; use std::sync::{Arc, Mutex}; -use crate::widgets::{Target, TargetType}; +use crate::widgets::{Layer, Target, TargetType}; use super::offscreen_renderer::CanvasWrapper; -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct RenderResult { - canvas: Arc>, - img: Target, + pub layer: Layer, time: DateTime, } -impl Drop for RenderResult { - fn drop(&mut self) { - let mut canvas = self.canvas.lock().unwrap(); - if let TargetType::ImageId(img) = self.img.target { - canvas.delete_image(img); - } - let _ = self; - } -} +// impl Drop for RenderResult { +// fn drop(&mut self) { +// let mut canvas = self.canvas.lock().unwrap(); +// if let TargetType::ImageId(img) = self.img.target { +// canvas.delete_image(img); +// } +// let _ = self; +// } +// } impl RenderResult { - pub fn new(canvas: Arc>, img: Target, time: DateTime) -> Self { - Self { canvas, img, time } + pub fn new(layer: Layer, time: DateTime) -> Self { + Self { layer, time } } pub fn timestamp(&self) -> i64 { self.time.timestamp() } - pub fn target(&self) -> Target { - self.img.clone() + pub fn time(&self) -> DateTime { + self.time } } diff --git a/src/pipeline/utils.rs b/src/pipeline/utils.rs index 3769bd7..57783a2 100644 --- a/src/pipeline/utils.rs +++ b/src/pipeline/utils.rs @@ -2,13 +2,14 @@ use super::render_pipeline::RenderResult; use super::{offscreen_renderer::OffscreenRenderer, pool::Pool}; use crate::coords::proj::Mercator; use crate::coords::Mapper; -use crate::widgets::CMS; +use crate::widgets::{Render, Target, TargetType, CMS}; use crate::{data::Radar2d, errors::RenderError, widgets::Layer, PLUGIN_MANAGER}; use chrono::{prelude::*, Duration}; use futures::future::*; use radarg_plugin_interface::*; use regex::Regex; use smallvec::SmallVec; +use std::sync::Mutex; use std::{ borrow::Borrow, collections::{HashMap, VecDeque}, @@ -17,7 +18,8 @@ use std::{ pin::Pin, sync::Arc, }; -use tokio::sync::{oneshot, Mutex}; +use tokio::sync::oneshot; +use tokio::task; pub fn ck() { unsafe { @@ -26,9 +28,9 @@ pub fn ck() { } pub struct Pipeline { - pool: Vec>>>>, + pool: Option>>>, switcher: Pool>, - results: Mutex>, + results: SmallVec<[RenderResult; 20]>, dispatcher: Option>>, handlers: Option>, key: String, @@ -37,9 +39,9 @@ pub struct Pipeline { impl Pipeline { pub fn new(len: usize, key: String) -> Self { Self { - pool: Vec::new(), + pool: Some(Vec::new()), switcher: Pool::new(len), - results: Mutex::new(SmallVec::new()), + results: SmallVec::new(), dispatcher: None, handlers: None, key, @@ -50,19 +52,6 @@ impl Pipeline { self.dispatcher = Some(dispatcher); } - pub async fn run(&mut self) { - let (mut tx, rx) = oneshot::channel::(); - self.handlers = Some(rx); - - let result = tokio::select! { - res = try_join_all(&mut self.pool) => res, - _ = tx.closed() => { - self.handlers = None; - Err(RenderError::Canceled) - } - }; - } - pub fn set_current(&mut self, current_time: DateTime, check_existed: bool) { if let Some(mut rx) = self.handlers.take() { rx.close(); @@ -73,64 +62,95 @@ impl Pipeline { if let Some(paths) = paths { for (path, datetime) in paths.into_iter() { - let future_task = async move { - let loader = PLUGIN_MANAGER.get_plugin_by_name("etws_loader").unwrap(); - let mut loaded_data = loader.load(path.as_str().into()).unwrap(); - let first_block = loaded_data.blocks.pop().unwrap(); - if let Some((_, layer)) = data_to_layer(first_block) { - let mut offscreen_renderer = OffscreenRenderer::new(3000, 3000).unwrap(); - let canvas_wrapper = offscreen_renderer.create_canvas(); - - let canvas_mutex = - std::sync::Arc::new(std::sync::Mutex::new(canvas_wrapper)); - - let f = { - let p = layer.get_prepare(); - let mut _p = p.lock().unwrap(); - _p.take() - }; - - let target = if let Some(f) = f { - let imp = layer.get_imp().unwrap(); - let map: Mapper = Mercator::default().into(); - let cms = CMS::new(map, (3000.0, 3000.0)); - let canvas = canvas_mutex.clone(); - let c = f(imp, canvas, cms).await; - Some(c) - } else { - None - }; - - Ok(RenderResult::new(canvas_mutex, target.unwrap(), datetime)) - } else { - Err(RenderError::None) - } - }; - self.add_task(datetime.timestamp(), future_task); - // self.add_task(datetime.timestamp(), future_task); + self.add_task(datetime.timestamp(), self.worker(datetime, path)); } } + + println!("task len: {}", self.pool.as_ref().unwrap().len()); + } + + fn worker( + &self, + datetime: DateTime, + path: impl AsRef + Send + 'static, + ) -> BoxFuture<'static, Result> { + Box::pin(async move { + let loader = PLUGIN_MANAGER.get_plugin_by_name("etws_loader").unwrap(); + let mut loaded_data = loader.load(path.as_ref().into()).unwrap(); + let first_block = loaded_data.blocks.pop().unwrap(); + if let Some((_, layer)) = data_to_layer(first_block) { + let handle = task::spawn_blocking(move || { + let mut offscreen_renderer = OffscreenRenderer::new(3000, 3000).unwrap(); + let canvas_wrapper = offscreen_renderer.create_canvas(); + let canvas_mutex = std::sync::Arc::new(std::sync::Mutex::new(canvas_wrapper)); + + let f = { + let p = layer.get_prepare(); + let mut _p = p.lock().unwrap(); + _p.take() + }; + + let target = if let Some(f) = f { + let imp = layer.get_imp().unwrap(); + let map: Mapper = Mercator::default().into(); + let cms = CMS::new(map, (3000.0, 3000.0)); + let canvas = canvas_mutex.clone(); + let c = f(imp, canvas.clone(), cms); + let canvas = canvas.lock().unwrap(); + Some(c) + } else { + None + }; + + layer.set_render_target(target.unwrap()); + layer + }); + + let target = handle.await.unwrap(); + + Ok(RenderResult::new(target, datetime)) + } else { + println!("no layer"); + Err(RenderError::None) + } + }) } pub fn add_task(&mut self, timestamp: i64, task: TASK) where - TASK: Future> + 'static, + TASK: Future> + 'static + Send, { let (mut tx, rx) = oneshot::channel::(); let future = async move { - tokio::select! { - res = task => res, - _ = tx.closed() => { - println!("task canceled"); - Err(RenderError::Canceled) - }, - } + task.await + // tokio::select! { + // res = task => res, + // _ = tx.closed() => { + // println!("task canceled"); + // Err(RenderError::Canceled) + // }, + // } }; - self.pool.push(Box::pin(future)); + + self.pool.as_mut().unwrap().push(Box::pin(future)); self.switcher.add(rx, timestamp); } + pub fn run(&mut self) -> BoxFuture<'static, Vec>> { + let pool = self.get_pool().unwrap(); + Box::pin(async move { + let result = join_all(pool).await; + return result; + }) + } + + pub fn get_pool( + &mut self, + ) -> Option>>> { + self.pool.take() + } + pub fn cancel_task(&mut self, timestamp: i64) {} } @@ -182,49 +202,52 @@ impl Dispatcher { let datetime_format: regex::Regex = Regex::new(r"(?:%[YHMSmd](?:[-/:_]?%[YHMSmd])*)").unwrap(); self.path_format.get(name).map(|s| { - let mut path = s.clone(); + let path = s.clone(); let need_formated = datetime_format.captures_iter(&path).collect::>(); let mut fore = self.fore_len; - let mut back = self.back_len; + let mut back = 0; let mut result_paths = Vec::new(); while fore > 0 { + let mut result_path = path.clone(); let t = current_time - self.step * fore as i32; for need_format in need_formated.iter() { let fmt = need_format.get(0).unwrap().as_str(); let t = t.format(fmt).to_string(); - path.replace(fmt, &t); + result_path = result_path.replace(fmt, &t); } if check_existed { - if !std::path::Path::new(&path).exists() { + if !std::path::Path::new(&result_path).exists() { continue; } else { - result_paths.push((path.clone(), t)); + result_paths.push((result_path.clone(), t)); } } else { - result_paths.push((path.clone(), t)); + result_paths.push((result_path.clone(), t)); } fore = fore - 1; } - while back > 0 { - let t = current_time + self.step * fore as i32; + + while back < self.back_len { + let mut result_path = path.clone(); + let t = current_time + self.step * back as i32; for need_format in need_formated.iter() { let fmt = need_format.get(0).unwrap().as_str(); let t = t.format(fmt).to_string(); - path.replace(fmt, &t); + result_path = result_path.replace(fmt, &t); } if check_existed { - if !std::path::Path::new(&path).exists() { + if !std::path::Path::new(&result_path).exists() { continue; } else { - result_paths.push((path.clone(), t)); + result_paths.push((result_path.clone(), t)); } } else { - result_paths.push((path.clone(), t)); + result_paths.push((result_path.clone(), t)); } - back = back - 1; + back = back + 1; } result_paths @@ -320,3 +343,15 @@ fn data_to_layer(block: Block) -> Option<(DateTime, Layer)> { _ => None, } } + +#[test] +fn test_send_sync() { + fn assert_send() {} + fn assert_sync() {} + + assert_send::(); // 如果 MyStruct 不是 Send,这里会编译失败 + + assert_send::(); +} + +// Pin, RenderError>> + Send + 'static>> diff --git a/src/widgets/render/interior/layers.rs b/src/widgets/render/interior/layers.rs index 73cb7b1..1b9d541 100644 --- a/src/widgets/render/interior/layers.rs +++ b/src/widgets/render/interior/layers.rs @@ -19,8 +19,7 @@ type PrepareFunc = Arc< // Box, Arc>, CMS, - ) - -> Pin + Send + Sync>> + ) -> Target + Sync + Send, >, @@ -57,9 +56,9 @@ pub trait LayerImpl: Debug { impl Layer { pub fn new< - FU: Future + Send + Sync + 'static, + // FU: Future + Send + Sync + 'static, F: 'static + Fn(&Self, Render, (f32, f32)) + Send + Sync, - PREPARE: FnOnce(LayerImplSync, Arc>, CMS) -> FU + Send + Sync + 'static, + PREPARE: FnOnce(LayerImplSync, Arc>, CMS) -> Target + Send + Sync + 'static, IMP: LayerImpl + Sync + Send + 'static, >( visiable: bool, @@ -73,17 +72,9 @@ impl Layer { target: Arc::new(Mutex::new(None)), name: layer_name, prepare: Arc::new(Mutex::new(prepare.map(|p| { - Box::new(move |a, b, c| { - Box::pin(p(a, b, c)) - as Pin + Send + Sync + 'static>> - }) + Box::new(move |a, b, c| p(a, b, c)) as Box< - dyn FnOnce( - LayerImplSync, - Arc>, - CMS, - ) - -> Pin + Send + Sync>> + dyn FnOnce(LayerImplSync, Arc>, CMS) -> Target + Sync + Send, > @@ -125,6 +116,7 @@ impl Layer { #[derive(Clone, Debug)] pub struct Target { pub target: TargetType, + pub thumbnail: Option, pub width: f32, pub height: f32, pub bounds: (Range, Range), @@ -137,12 +129,19 @@ pub enum TargetType { } impl Target { - pub fn new(target: TargetType, width: f32, height: f32, bounds: (Range, Range)) -> Self { + pub fn new( + target: TargetType, + width: f32, + height: f32, + bounds: (Range, Range), + thumbnail: Option, + ) -> Self { Self { target, width, height, bounds, + thumbnail, } } diff --git a/src/widgets/render/predefined/grid_field_renderer.rs b/src/widgets/render/predefined/grid_field_renderer.rs index 4c07259..436534d 100644 --- a/src/widgets/render/predefined/grid_field_renderer.rs +++ b/src/widgets/render/predefined/grid_field_renderer.rs @@ -4,7 +4,7 @@ use femtovg::{ }; use geo_types::LineString; use gl::types::GLvoid; -use image::{ImageBuffer, Rgba}; +use image::{imageops::resize, ImageBuffer, Rgba}; use ndarray::ArrayView2; use num_traits::{Num, NumOps}; use std::{fmt::Debug, io::Cursor, marker::PhantomData}; @@ -151,6 +151,16 @@ where let img: ImageBuffer, Vec> = ImageBuffer::from_raw(w as u32, h as u32, pixels) .expect("Failed to create ImageBuffer"); + + let thumbnail = resize(&img, 500, 500, image::imageops::FilterType::Lanczos3); + let mut thumb_buffer = Cursor::new(Vec::new()); + img.write_to(&mut thumb_buffer, image::ImageOutputFormat::Png) + .expect("Failed to write PNG buffer"); + let thumb_data = thumb_buffer.into_inner(); + + let thumbnail_tex = + gtk::gdk::Texture::from_bytes(>k::glib::Bytes::from(&thumb_data)).unwrap(); + // 将 ImageBuffer 编码为 PNG let mut png_buffer = Cursor::new(Vec::new()); img.write_to(&mut png_buffer, image::ImageOutputFormat::Png) @@ -169,6 +179,7 @@ where w, h, ((d1_start, d1_end).into(), (d2_start, d2_end).into()), + Some(thumbnail_tex), ) } } diff --git a/src/widgets/render/predefined/layers.rs b/src/widgets/render/predefined/layers.rs index cc1f75e..65a5418 100644 --- a/src/widgets/render/predefined/layers.rs +++ b/src/widgets/render/predefined/layers.rs @@ -9,6 +9,7 @@ use std::sync::Mutex; use super::super::{cms::CMS, Layer, LayerImpl, LayerImplSync, Render, Target, TargetType}; use crate::data::{AsyncDataLoader, DataLoader, Radar2d}; use crate::pipeline::offscreen_renderer::CanvasWrapper; +use tokio::task; use super::{ color_mapper::ColorMapper, @@ -59,7 +60,7 @@ impl Layer { }, layer_name, Some( - |renderer: LayerImplSync, c: Arc>, cms: CMS| async move { + move |renderer: LayerImplSync, c: Arc>, cms: CMS| { let mut canvas = c.lock().unwrap(); let renderer = renderer.lock().unwrap(); let img = renderer.draw(&mut canvas, cms).unwrap();