From 0cb169d62e8ae117c5944081d4791d3102d9e336 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Fri, 26 Nov 2021 23:45:29 +0100 Subject: [PATCH] added -p -c -l -o options to uw8 run command --- Cargo.lock | 74 ++++++++++++++++++++++++++++ Cargo.toml | 3 +- platform/Cargo.lock | 68 +++++++++++++++++++++++++- platform/bin/loader.wasm | Bin 1192 -> 1192 bytes platform/bin/platform.uw8 | Bin 522 -> 520 bytes platform/src/main.rs | 6 ++- src/main.rs | 62 ++++++++++++++++++++++-- uw8-tool/Cargo.lock | 93 +++++++++++++++++++++++++++++++++++- uw8-tool/Cargo.toml | 3 +- uw8-tool/src/base_module.rs | 2 +- uw8-tool/src/pack.rs | 27 +++++++++-- 11 files changed, 321 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f915c85..9c37f8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -159,6 +159,16 @@ dependencies = [ "jobserver", ] +[[package]] +name = "cdivsufsort" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edefce019197609da416762da75bb000bbd2224b2d89a7e722c2296cbff79b8c" +dependencies = [ + "cc", + "sacabase", +] + [[package]] name = "cexpr" version = "0.4.0" @@ -957,6 +967,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.13.0" @@ -1020,6 +1039,18 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" +[[package]] +name = "pbr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff5751d87f7c00ae6403eb1fcbba229b9c76c9a30de8c1cf87182177b168cea2" +dependencies = [ + "crossbeam-channel", + "libc", + "time", + "winapi 0.3.9", +] + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -1237,6 +1268,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "sacabase" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9883fc3d6ce3d78bb54d908602f8bc1f7b5f983afe601dabe083009d86267a84" +dependencies = [ + "num-traits", +] + [[package]] name = "same-file" version = "1.0.6" @@ -1423,6 +1463,16 @@ dependencies = [ "syn", ] +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -1470,6 +1520,17 @@ dependencies = [ "regex", ] +[[package]] +name = "upkr" +version = "0.1.0" +source = "git+https://github.com/exoticorn/upkr.git?rev=7d280bd#7d280bd533b037d579b6cdf12fb69046eb5c2c91" +dependencies = [ + "anyhow", + "cdivsufsort", + "pbr", + "pico-args", +] + [[package]] name = "uw8" version = "0.1.0" @@ -1479,9 +1540,22 @@ dependencies = [ "minifb", "notify", "pico-args", + "uw8-tool", "wasmtime", ] +[[package]] +name = "uw8-tool" +version = "0.1.0" +dependencies = [ + "anyhow", + "pbr", + "pico-args", + "upkr", + "wasm-encoder", + "wasmparser 0.81.0", +] + [[package]] name = "vec_map" version = "0.8.2" diff --git a/Cargo.toml b/Cargo.toml index b11a549..8cbbd05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,4 +11,5 @@ anyhow = "1" minifb = "0.19" notify = "4" pico-args = "0.4" -curlywas = { git = "https://github.com/exoticorn/curlywas.git", rev = "d62bc8bf86cff65145d5aea045b81122bc15d709" } \ No newline at end of file +curlywas = { git = "https://github.com/exoticorn/curlywas.git", rev = "d62bc8bf86cff65145d5aea045b81122bc15d709" } +uw8-tool = { path = "uw8-tool" } \ No newline at end of file diff --git a/platform/Cargo.lock b/platform/Cargo.lock index 2f5a050..ff26b85 100644 --- a/platform/Cargo.lock +++ b/platform/Cargo.lock @@ -85,6 +85,26 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +dependencies = [ + "cfg-if", + "lazy_static", +] + [[package]] name = "crunchy" version = "0.2.2" @@ -141,6 +161,18 @@ dependencies = [ "autocfg", ] +[[package]] +name = "pbr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff5751d87f7c00ae6403eb1fcbba229b9c76c9a30de8c1cf87182177b168cea2" +dependencies = [ + "crossbeam-channel", + "libc", + "time", + "winapi", +] + [[package]] name = "pico-args" version = "0.4.2" @@ -171,6 +203,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -183,10 +225,11 @@ dependencies = [ [[package]] name = "upkr" version = "0.1.0" -source = "git+https://github.com/exoticorn/upkr.git?rev=5e82c65#5e82c65c1821fcf85b97dd9f71e8fce7cddc93c3" +source = "git+https://github.com/exoticorn/upkr.git?rev=7d280bd#7d280bd533b037d579b6cdf12fb69046eb5c2c91" dependencies = [ "anyhow", "cdivsufsort", + "pbr", "pico-args", ] @@ -195,6 +238,7 @@ name = "uw8-tool" version = "0.1.0" dependencies = [ "anyhow", + "pbr", "pico-args", "upkr", "wasm-encoder", @@ -222,6 +266,28 @@ version = "0.81.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98930446519f63d00a836efdc22f67766ceae8dbcc1571379f2bcabc6b2b9abc" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "yansi" version = "0.5.0" diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index 9aa75a5fcf58b977c491043af33decf780239a55..4e6ed69959b701eadbec0342b8a73e4694be988e 100644 GIT binary patch delta 371 zcmV-(0gV2r38)FMKLdX!{CYmQS#~P2{J!@b>T3Vut=E;MKU-E3!3DiM&keAl0`a2j zdkkbPq5=etG409>*=2sbfSBbss2Yk-!29YBq@!~yJH93hvJTfNXu8Z}-_0qYpYd4m z6hG`4e+IfBKq^L4erO{2&1O$6DHvwUE326UXv-77hf9Ekc&^wInkFsfm2yElhGwVwzC^y|&u=Xe#!vlUtSIN9PTKo#>oOXCP%) z>hbu75@XBYV(n{jnq$&{w??L%@m7i{jTN0x;Nz@E>Ca!b}Bu0uIX|24#r&GtrYrGca>*Bi#k&uwjUCF8Ony Rn-h5c9v9(ewP)>$Nr0kJue1OF delta 371 zcmV-(0gV2r38)FMKLdX)`+q*4EY%;mOW7A8Aji4mSD9ObKwbZLoh=kL)-iE_) z8PP2+8%8m`zJlKp#QL>8TZSP40S>T;&pB}b;39n1`rT2}CR2YkWH3vFvTIU5!!q3% z74<8qa@^Coa8UIC)8};YI zZWyJ2V2Dc7InV^cNO6i0<$H-i>|+fyujP&~HAEhI=ZB?S`&u{P15)Vv8XavaQXiFA zvCuz;Ro(ekRyS*M&-jKr;0jnd$CngxS$86&9w6KuSxd7znAA6BNa~QMSCUDYdIk4J zdz@#z-i%pTu?_1q1Xut;^|J^Xa}0I1cX}!p(SrYZCnN|4hAL_oA2yn{BF;{=Nf2y2 RQ9WF`t!xO1ZCLcD3|YnC~ZrE6e`F8tn^dUZc&Tz^>46PUJ*B5=hBsQt83FKl&r zEq>tN!-bdqh)6IyS@{mtJUffDFEcFA>$;k?!PSF=p?oQjE0kNp9c*RDe6dWU0o}8z zl`~QF#*E?vQ1jjPzo~#vLA@)HUB)v$}@>hya_7ky)3%tS*Bu9LeY! z7GrO5^x5CDLlrQEn5!0<-u%k>zCBkCYy=y2rxSU%<{h}p`a3Z5F*-?LNQL7|xsqs9OHAlD6rhVEM*4QpfG)8WAs?TY-HCR0AjhNc)ZpzC>W3 z@2uFo!!;~x7V_?W4sGR2o5LIOm1R4wbRpXhul=HIxMi{Ew_x&CS8iivK_StX-JbIS zw4n#?*6~v_LQlAP;8TWk496-@D<`O5%RBglg6a1vTX(vWptw z1-78p(7O$a+}{gN@;->efD9ua{H71_V>?gQ+X7~35D;y7a*ak3$OS42hc#yMKw!x5 KxPT<2pr*$89R`X3 literal 522 zcmV+l0`>g@2YUH_4Ky3S9;`4P1u>jC3DCgXfk1+5QNRN`HMCNl5PyG%=H4y#N~-JH z1jGlvO~Kdb)pwF)Jh8wO&ty1wqE1(o3I-fcMG@g{X9-f<_B_k~^1<5IV^xn5N%3^r z40zpuvUy(&3?HL-^iJ6>;4^AuOp+L@1c$;2gmLePezE^LZ;r*HSt9_>!C;#;rz$C6 zdwPb?aHn44zHQ=OVRJf_Zi zqp~8nfVJ$>*qK1V5Kxl_$E-tTf%zg=hD`dF%;(%BbN zsFP%-u`z1JxQGB>js-!pVi2}dG_BZbUFUg{L3I{C7<^4lq3Q;b!IrFWtkRt5dp?Wr zX4ij4u{k#wFL{q+R{U#vLnj%i|`v4xe+K_K_0#4L0dy6nMtuG zgp)&OqMjM@+j>t6a~+teM^2T8WZA=!b)tJdG}bpG;uH$^*XV4?;ow;^a=PS@HYQ%; zbUB{Cuv4eu)-H%Z2PmME6?H-{K}80=64 McS)$7Q@lqr02YY;p8x;= diff --git a/platform/src/main.rs b/platform/src/main.rs index 822e91a..2804bf1 100644 --- a/platform/src/main.rs +++ b/platform/src/main.rs @@ -11,15 +11,17 @@ fn main() -> Result<()> { let loader = curlywas::compile_file("src/loader.cwa")?; File::create("bin/loader.wasm")?.write_all(&loader)?; + println!("Loader (including base module): {} bytes", loader.len()); + println!("Compiling platform module"); let platform = curlywas::compile_file("src/platform.cwa")?; println!("Compressing platform module"); let platform = uw8_tool::pack( &platform, - uw8_tool::PackConfig::default().with_compression(), + uw8_tool::PackConfig::default().with_compression_level(4), )?; File::create("bin/platform.uw8")?.write_all(&platform)?; - println!("All done!"); + println!("Platform module: {} bytes", platform.len()); Ok(()) } diff --git a/src/main.rs b/src/main.rs index d91906f..a6e311e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,22 +1,54 @@ use std::fs::File; +use std::io::prelude::*; +use std::process; use std::sync::mpsc; use std::time::Duration; use std::{ path::{Path, PathBuf}, process::exit, }; -use std::io::prelude::*; use anyhow::{bail, Result}; -use uw8::MicroW8; use notify::{DebouncedEvent, Watcher}; use pico_args::Arguments; +use uw8::MicroW8; fn main() -> Result<()> { let mut args = Arguments::from_env(); + match args.subcommand()?.as_ref().map(|s| s.as_str()) { + Some("run") => run(args), + Some(other) => { + eprintln!("Unknown command '{}'", other); + process::exit(1); + } + None => { + println!("Usage:"); + println!(" uw8 run [-w] [-p] [-c] [-l] [-o ] "); + Ok(()) + } + } +} + +fn run(mut args: Arguments) -> Result<()> { let watch_mode = args.contains(["-w", "--watch"]); + let mut config = Config::default(); + config.pack = args.contains(["-p", "--pack"]); + if args.contains(["-c", "--compress"]) { + config.compression = Some(2); + } + + if let Some(level) = args.opt_value_from_str(["-l", "--level"])? { + config.compression = Some(level); + } + + if let Some(path) = + args.opt_value_from_os_str::<_, _, bool>(["-o", "--output"], |s| Ok(s.into()))? + { + config.output_path = Some(path); + } + let filename = args.free_from_os_str::(|s| Ok(s.into()))?; let mut uw8 = MicroW8::new()?; @@ -28,7 +60,7 @@ fn main() -> Result<()> { watcher.watch(&filename, notify::RecursiveMode::NonRecursive)?; } - if let Err(err) = load_cart(&filename, &mut uw8) { + if let Err(err) = load_cart(&filename, &mut uw8, &config) { eprintln!("Load error: {}", err); if !watch_mode { exit(1); @@ -38,7 +70,7 @@ fn main() -> Result<()> { while uw8.is_open() { match rx.try_recv() { Ok(DebouncedEvent::Create(_) | DebouncedEvent::Write(_)) => { - if let Err(err) = load_cart(&filename, &mut uw8) { + if let Err(err) = load_cart(&filename, &mut uw8, &config) { eprintln!("Load error: {}", err); } } @@ -52,7 +84,14 @@ fn main() -> Result<()> { Ok(()) } -fn load_cart(filename: &Path, uw8: &mut MicroW8) -> Result<()> { +#[derive(Default)] +struct Config { + pack: bool, + compression: Option, + output_path: Option, +} + +fn load_cart(filename: &Path, uw8: &mut MicroW8, config: &Config) -> Result<()> { let mut cart = vec![]; File::open(filename)?.read_to_end(&mut cart)?; @@ -61,6 +100,19 @@ fn load_cart(filename: &Path, uw8: &mut MicroW8) -> Result<()> { cart = curlywas::compile_str(&src)?; } + if config.pack { + let mut pack_config = uw8_tool::PackConfig::default(); + if let Some(level) = config.compression { + pack_config = pack_config.with_compression_level(level); + } + cart = uw8_tool::pack(&cart, pack_config)?; + println!("packed size: {} bytes", cart.len()); + } + + if let Some(ref path) = config.output_path { + File::create(path)?.write_all(&cart)?; + } + if let Err(err) = uw8.load_from_memory(&cart) { eprintln!("Load error: {}", err); Err(err) diff --git a/uw8-tool/Cargo.lock b/uw8-tool/Cargo.lock index 702f307..9bf8f90 100644 --- a/uw8-tool/Cargo.lock +++ b/uw8-tool/Cargo.lock @@ -30,12 +30,50 @@ dependencies = [ "sacabase", ] +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "crossbeam-channel" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "leb128" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +[[package]] +name = "libc" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" + [[package]] name = "num-traits" version = "0.2.14" @@ -45,6 +83,18 @@ dependencies = [ "autocfg", ] +[[package]] +name = "pbr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff5751d87f7c00ae6403eb1fcbba229b9c76c9a30de8c1cf87182177b168cea2" +dependencies = [ + "crossbeam-channel", + "libc", + "time", + "winapi", +] + [[package]] name = "pico-args" version = "0.4.2" @@ -60,13 +110,25 @@ dependencies = [ "num-traits", ] +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi", + "winapi", +] + [[package]] name = "upkr" version = "0.1.0" -source = "git+https://github.com/exoticorn/upkr.git?rev=11b43f9bc4460d960a13829a8a64ff4af11d1665#11b43f9bc4460d960a13829a8a64ff4af11d1665" +source = "git+https://github.com/exoticorn/upkr.git?rev=7d280bd#7d280bd533b037d579b6cdf12fb69046eb5c2c91" dependencies = [ "anyhow", "cdivsufsort", + "pbr", "pico-args", ] @@ -75,12 +137,19 @@ name = "uw8-tool" version = "0.1.0" dependencies = [ "anyhow", + "pbr", "pico-args", "upkr", "wasm-encoder", "wasmparser", ] +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasm-encoder" version = "0.8.0" @@ -95,3 +164,25 @@ name = "wasmparser" version = "0.81.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98930446519f63d00a836efdc22f67766ceae8dbcc1571379f2bcabc6b2b9abc" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/uw8-tool/Cargo.toml b/uw8-tool/Cargo.toml index 88a6599..6eb39df 100644 --- a/uw8-tool/Cargo.toml +++ b/uw8-tool/Cargo.toml @@ -10,4 +10,5 @@ wasmparser = "0.81" wasm-encoder = "0.8" anyhow = "1" pico-args = "0.4" -upkr = { git = "https://github.com/exoticorn/upkr.git", rev = "5e82c65" } \ No newline at end of file +upkr = { git = "https://github.com/exoticorn/upkr.git", rev = "7d280bd" } +pbr = "1" \ No newline at end of file diff --git a/uw8-tool/src/base_module.rs b/uw8-tool/src/base_module.rs index 3ae0903..2c01acf 100644 --- a/uw8-tool/src/base_module.rs +++ b/uw8-tool/src/base_module.rs @@ -195,7 +195,7 @@ impl BaseModule { pub fn create_binary(path: &Path) -> Result<()> { let base1 = BaseModule::for_format_version(1)?.to_wasm(); - let data = upkr::pack(&base1); + let data = upkr::pack(&base1, 4, None); File::create(path)?.write_all(&data)?; Ok(()) } diff --git a/uw8-tool/src/pack.rs b/uw8-tool/src/pack.rs index c5dd916..cb7bc48 100644 --- a/uw8-tool/src/pack.rs +++ b/uw8-tool/src/pack.rs @@ -14,19 +14,24 @@ use wasmparser::{ }; pub struct PackConfig { - compression: bool, + compression: Option, } impl PackConfig { pub fn with_compression(mut self) -> Self { - self.compression = true; + self.compression = Some(2); + self + } + + pub fn with_compression_level(mut self, level: u8) -> Self { + self.compression = Some(level); self } } impl Default for PackConfig { fn default() -> PackConfig { - PackConfig { compression: false } + PackConfig { compression: None } } } @@ -46,9 +51,21 @@ pub fn pack(data: &[u8], config: PackConfig) -> Result> { let parsed_module = ParsedModule::parse(data)?; let result = parsed_module.pack(&base)?; - if config.compression { + if let Some(level) = config.compression { let mut uw8 = vec![2]; - uw8.extend_from_slice(&upkr::pack(&result[8..])); + + let content = &result[8..]; + let mut pb = pbr::ProgressBar::new(content.len() as u64); + pb.set_units(pbr::Units::Bytes); + + uw8.extend_from_slice(&upkr::pack( + &result[8..], + level, + Some(&mut |pos| { + pb.set(pos as u64); + }), + )); + pb.finish(); Ok(uw8) } else { let mut uw8 = vec![1];