diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 36818aa..0b2c409 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -10,10 +10,13 @@ jobs: steps: - uses: actions/checkout@v2 - name: Nightly toolchain - run: rustup toolchain install nightly + run: rustup toolchain install nightly --component clippy - name: Lint run: cargo fmt -- --check + - name: Clippy Warnings + run: cargo +nightly clippy --all-targets --all-features -- -D warnings - name: Build run: cargo +nightly build - name: Run tests run: cargo +nightly test + diff --git a/Cargo.lock b/Cargo.lock index 0263eb5..a66ef04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -488,6 +488,18 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +[[package]] +name = "bstr" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473fc6b38233f9af7baa94fb5852dca389e3d95b8e21c8e3719301462c5d9faf" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" version = "2.6.0" @@ -563,6 +575,15 @@ dependencies = [ "nix", ] +[[package]] +name = "cast" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" +dependencies = [ + "rustc_version", +] + [[package]] name = "cc" version = "1.0.66" @@ -618,6 +639,17 @@ dependencies = [ "unsigned-varint", ] +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "bitflags", + "textwrap", + "unicode-width", +] + [[package]] name = "clipboard-win" version = "4.0.3" @@ -846,6 +878,42 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "criterion" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8" +dependencies = [ + "atty", + "cast", + "clap", + "criterion-plot", + "csv", + "itertools 0.9.0", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_cbor", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d" +dependencies = [ + "cast", + "itertools 0.9.0", +] + [[package]] name = "crossbeam-channel" version = "0.5.0" @@ -918,6 +986,28 @@ dependencies = [ "subtle 2.4.0", ] +[[package]] +name = "csv" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d58633299b24b515ac72a3f869f8b91306a3cec616a602843a383acd6f9e97" +dependencies = [ + "bstr", + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + [[package]] name = "curve25519-dalek" version = "3.0.2" @@ -1069,18 +1159,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" dependencies = [ "libc", - "redox_users", + "redox_users 0.3.5", "winapi 0.3.9", ] [[package]] name = "dirs-sys-next" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99de365f605554ae33f115102a02057d4fc18b01f3284d6870be0938743cfe7d" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users", + "redox_users 0.4.0", "winapi 0.3.9", ] @@ -1480,6 +1570,7 @@ version = "0.0.3" dependencies = [ "anyhow", "async-std", + "criterion", "directories-next", "iced", "iced_futures", @@ -1532,7 +1623,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4060f4657be78b8e766215b02b18a2e862d83745545de804638e2b545e81aee6" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.10.1+wasi-snapshot-preview1", ] [[package]] @@ -1772,6 +1874,12 @@ dependencies = [ "svg_fmt", ] +[[package]] +name = "half" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" + [[package]] name = "hashbrown" version = "0.9.1" @@ -2154,6 +2262,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -2363,7 +2480,7 @@ dependencies = [ "libp2p-yamux", "parity-multiaddr", "parking_lot", - "pin-project 1.0.3", + "pin-project 1.0.4", "smallvec", "wasm-timer", ] @@ -2405,7 +2522,7 @@ dependencies = [ "multistream-select", "parity-multiaddr", "parking_lot", - "pin-project 1.0.3", + "pin-project 1.0.4", "prost", "prost-build", "rand 0.7.3", @@ -2887,7 +3004,7 @@ dependencies = [ "bytes", "futures", "log", - "pin-project 1.0.3", + "pin-project 1.0.4", "smallvec", "unsigned-varint", ] @@ -3127,6 +3244,12 @@ version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + [[package]] name = "opaque-debug" version = "0.2.3" @@ -3210,7 +3333,7 @@ dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall", + "redox_syscall 0.1.57", "smallvec", "winapi 0.3.9", ] @@ -3261,11 +3384,11 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a83804639aad6ba65345661744708855f9fbcb71176ea8d28d05aeb11d975e7" +checksum = "95b70b68509f17aa2857863b6fa00bf21fc93674c7a8893de2f469f6aa7ca2f2" dependencies = [ - "pin-project-internal 1.0.3", + "pin-project-internal 1.0.4", ] [[package]] @@ -3281,9 +3404,9 @@ dependencies = [ [[package]] name = "pin-project-internal" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7bcc46b8f73443d15bc1c5fecbb315718491fa9187fa483f0e359323cde8b3a" +checksum = "caa25a6393f22ce819b0f50e0be89287292fda8d425be38ee0ca14c4931d9e71" dependencies = [ "proc-macro2", "quote", @@ -3292,9 +3415,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36743d754ccdf9954c2e352ce2d4b106e024c814f6499c2dadff80da9a442d8" +checksum = "ba36e0a6cc5a4c645073f4984f1ed55d09f5857d4de7c14550baa81a39ef5a17" [[package]] name = "pin-utils" @@ -3308,6 +3431,18 @@ version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +[[package]] +name = "plotters" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" +dependencies = [ + "js-sys", + "num-traits", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "png" version = "0.16.8" @@ -3442,7 +3577,7 @@ checksum = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" dependencies = [ "bytes", "heck", - "itertools", + "itertools 0.8.2", "log", "multimap", "petgraph", @@ -3459,7 +3594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" dependencies = [ "anyhow", - "itertools", + "itertools 0.8.2", "proc-macro2", "quote", "syn", @@ -3519,7 +3654,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", "rand_core 0.5.1", @@ -3557,7 +3692,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", ] [[package]] @@ -3624,17 +3759,36 @@ version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +[[package]] +name = "redox_syscall" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48b82c2a1e8eb6e1bfde608de2bcbebd4072aa32d056ea48a986990cd5ca0f5a" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" dependencies = [ - "getrandom", - "redox_syscall", + "getrandom 0.1.16", + "redox_syscall 0.1.57", "rust-argon2", ] +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom 0.2.1", + "redox_syscall 0.2.1", +] + [[package]] name = "regex" version = "1.4.3" @@ -3647,6 +3801,15 @@ dependencies = [ "thread_local", ] +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", +] + [[package]] name = "regex-syntax" version = "0.6.22" @@ -3788,6 +3951,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_cbor" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622" +dependencies = [ + "half", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.118" @@ -4103,7 +4276,7 @@ dependencies = [ "cfg-if 0.1.10", "libc", "rand 0.7.3", - "redox_syscall", + "redox_syscall 0.1.57", "remove_dir_all", "winapi 0.3.9", ] @@ -4117,6 +4290,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "thiserror" version = "1.0.23" @@ -4163,6 +4345,16 @@ dependencies = [ "weezl", ] +[[package]] +name = "tinytemplate" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ada8616fad06a2d0c455adc530de4ef57605a8120cc65da9653e0e9623ca74" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "tinyvec" version = "1.1.0" @@ -4300,6 +4492,12 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + [[package]] name = "unicode-xid" version = "0.2.1" @@ -4387,6 +4585,12 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasi" +version = "0.10.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93c6c3420963c5c64bca373b25e77acb562081b9bb4dd5bb864187742186cea9" + [[package]] name = "wasm-bindgen" version = "0.2.69" diff --git a/Cargo.toml b/Cargo.toml index 8868108..8e7a26d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,9 +29,6 @@ incremental = true lto = true codegen-units = 1 -[dev-dependencies] -tempfile = "3.1" - [dependencies] # Debugging pretty_env_logger = "0.4" @@ -61,3 +58,11 @@ infer = "0.3" ipfs-embed = "0.10" libipld = "0.8" # ipld-collections = "0.3.0" + +[dev-dependencies] +tempfile = "3.1" +criterion = "0.3" + +[[bench]] +name = "ipfs" +harness = false diff --git a/benches/ipfs.rs b/benches/ipfs.rs new file mode 100644 index 0000000..34a7e3f --- /dev/null +++ b/benches/ipfs.rs @@ -0,0 +1,110 @@ +use fuzzr::data::{ + content::ContentItem, + ipfs_client::{IpfsClient, IpfsClientRef}, +}; +use fuzzr::data::{ + content::TextContent, + ipfs_ops::{load_file, store_file}, +}; + +use async_std::{ + sync::{Arc, Mutex}, + task::block_on, +}; +use criterion::{ + criterion_group, criterion_main, AxisScale, Criterion, PlotConfiguration, Throughput, +}; +use tempfile::tempdir; + +use std::{ + error::Error, + fs::File, + io::Write, + path::{Path, PathBuf}, +}; + +/// Helper to create file in a directory and return full path. +fn write_file

(dir: P, data: &[u8], file_name: &str) -> Result> +where + P: AsRef, +{ + let path = dir.as_ref().join(file_name); + let mut file = File::create(&path)?; + file.write_all(data)?; + Ok(path) +} + +fn new_client() -> Result> { + block_on(async { + Ok(Arc::new(Mutex::new( + IpfsClient::new() + .await + .map_err(|e| Arc::try_unwrap(e).unwrap())?, + ))) + }) +} + +fn criterion_benchmark_ipfs_text(c: &mut Criterion) { + const KB: usize = 1024; + let dir = tempdir().unwrap(); + let client_ref = new_client().unwrap(); + + { + let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic); + let mut group = c.benchmark_group("load_text_throughput"); + group.plot_config(plot_config); + + for size in [KB, 16 * KB, 256 * KB, 1000 * KB].iter() { + let bees = vec![66; *size]; + let file_name = format!("B_{}.txt", size); + let path = write_file(dir.path(), bees.as_slice(), &file_name).unwrap(); + + let client_ref_c = client_ref.clone(); + let cid = block_on(store_file(path, client_ref_c)) + .unwrap() + .unwrap() + .to_string(); + + let client_ref = client_ref.clone(); + group.throughput(Throughput::Bytes(*size as u64)); + group.bench_with_input(format!("{}_bytes", size), &cid, |b, cid| { + b.iter(|| { + if let ContentItem::Text(TextContent { string }, _) = + block_on(load_file(cid.clone(), client_ref.clone())).unwrap() + { + assert!(string.starts_with('B')); + assert_eq!(string.len(), *size); + } + }) + }); + } + group.finish(); + } + + { + let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic); + let mut group = c.benchmark_group("store_text_throughput"); + group.plot_config(plot_config); + + for size in [KB, 16 * KB, 256 * KB, 1000 * KB].iter() { + let tees = vec![84; *size]; + let file_name = format!("T_{}.txt", size); + let path = write_file(dir.path(), tees.as_slice(), &file_name).unwrap(); + + group.throughput(Throughput::Bytes(*size as u64)); + group.bench_with_input(format!("{}_bytes", size), &path, |b, path| { + b.iter(|| { + let cid = block_on(store_file(path.clone(), client_ref.clone())) + .unwrap() + .unwrap() + .to_string(); + assert!(!cid.is_empty()); + }) + }); + } + group.finish(); + } +} + +criterion_group!(benches, criterion_benchmark_ipfs_text); +criterion_main!(benches); diff --git a/src/main.rs b/src/bin/fuzzr.rs similarity index 86% rename from src/main.rs rename to src/bin/fuzzr.rs index c2ddee4..cf2b906 100644 --- a/src/main.rs +++ b/src/bin/fuzzr.rs @@ -6,26 +6,20 @@ use iced_native::{window::Event::FileDropped, Event}; use async_std::sync::{Arc, Mutex}; use log::{error, info}; -mod data; -mod message; -mod page; -mod ui; - -use page::PageType; - -use page::dashboard::DashPage; -use page::feed::FeedPage; -use page::publish::PublishPage; -use page::settings::SettingsPage; -use page::site::SitePage; -use page::view::ViewPage; - -use message::Message; -use ui::style::Theme; -use ui::toolbar::Toolbar; - -use data::ipfs_client::{IpfsClient, IpfsClientRef}; -use data::ipfs_ops::{load_file, store_file}; +use fuzzr::{ + data::ipfs_client::{IpfsClient, IpfsClientRef}, + data::ipfs_ops::{load_file, store_file}, + message::Message, + page::dashboard::DashPage, + page::feed::FeedPage, + page::publish::PublishPage, + page::settings::SettingsPage, + page::site::SitePage, + page::view::ViewPage, + page::PageType, + ui::style::Theme, + ui::toolbar::Toolbar, +}; pub fn main() -> iced::Result { if std::env::var("RUST_LOG").is_err() { @@ -59,7 +53,7 @@ pub struct Fuzzr { impl Application for Fuzzr { type Executor = iced::executor::Default; - type Message = message::Message; + type Message = fuzzr::message::Message; type Flags = (); fn new(_flags: ()) -> (Fuzzr, Command) { @@ -105,13 +99,12 @@ impl Application for Fuzzr { match event { Message::PageChanged(page_type) => { self.current_page = page_type.clone(); - self.toolbar.active_page = page_type.clone(); + self.toolbar.active_page = page_type; Command::none() } Message::IpfsReady(ipfs_client) => { - match ipfs_client { - Ok(client) => self.ipfs_client = Some(Arc::new(Mutex::new(client))), - Err(_) => {} + if let Ok(client) = ipfs_client { + self.ipfs_client = Some(Arc::new(Mutex::new(client))) } Command::none() } @@ -157,10 +150,7 @@ impl Application for Fuzzr { fn subscription(&self) -> Subscription { iced_native::subscription::events_with(|event, _status| match event { - Event::Window(window_event) => match window_event { - FileDropped(path) => Some(Message::FileDroppedOnWindow(path)), - _ => None, - }, + Event::Window(FileDropped(path)) => Some(Message::FileDroppedOnWindow(path)), _ => None, }) } diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..8f0d209 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,4 @@ +pub mod data; +pub mod message; +pub mod page; +pub mod ui; diff --git a/src/page/dashboard.rs b/src/page/dashboard.rs index 0161dc1..a392c52 100644 --- a/src/page/dashboard.rs +++ b/src/page/dashboard.rs @@ -13,6 +13,12 @@ pub struct DashPage { // items: Vec, } +impl Default for DashPage { + fn default() -> Self { + Self::new() + } +} + impl DashPage { pub fn new() -> DashPage { DashPage { @@ -20,11 +26,7 @@ impl DashPage { } } - pub fn update(&mut self, msg: Message) { - match msg { - _ => {} - } - } + pub fn update(&mut self, _msg: Message) {} pub fn view(&self, theme: &Theme) -> Element { // let DashPage { .. } = self; diff --git a/src/page/feed.rs b/src/page/feed.rs index b846a2a..ca0d46d 100644 --- a/src/page/feed.rs +++ b/src/page/feed.rs @@ -11,6 +11,12 @@ pub struct FeedPage { scroll: scrollable::State, } +impl Default for FeedPage { + fn default() -> Self { + Self::new() + } +} + impl FeedPage { pub fn new() -> FeedPage { FeedPage { @@ -19,11 +25,7 @@ impl FeedPage { } } - pub fn update(&mut self, msg: Message) { - match msg { - _ => {} - }; - } + pub fn update(&mut self, _msg: Message) {} pub fn view(&self, theme: &Theme) -> Element { let feed_container = Column::new().push(Text::new("TODO: Feed page").size(18)); diff --git a/src/page/publish.rs b/src/page/publish.rs index 82e40fa..6ee00e0 100644 --- a/src/page/publish.rs +++ b/src/page/publish.rs @@ -8,21 +8,20 @@ pub struct PublishPage { cid: Option, } +impl Default for PublishPage { + fn default() -> Self { + Self::new() + } +} + impl PublishPage { pub fn new() -> PublishPage { PublishPage { cid: None } } pub fn update(&mut self, msg: Message) { - match msg { - Message::ContentAddedToIpfs(cid) => match cid { - Ok(cid) => match cid { - Some(cid) => self.cid = Some(cid.to_string()), - None => {} - }, - Err(_) => {} - }, - _ => {} + if let Message::ContentAddedToIpfs(Ok(Some(cid))) = msg { + self.cid = Some(cid.to_string()) } } diff --git a/src/page/settings.rs b/src/page/settings.rs index 4289bf4..8d727f2 100644 --- a/src/page/settings.rs +++ b/src/page/settings.rs @@ -9,6 +9,12 @@ pub struct SettingsPage { input_value: String, } +impl Default for SettingsPage { + fn default() -> Self { + Self::new() + } +} + impl SettingsPage { pub fn new() -> SettingsPage { SettingsPage { @@ -17,11 +23,7 @@ impl SettingsPage { } } - pub fn update(&mut self, msg: Message) { - match msg { - _ => {} - }; - } + pub fn update(&mut self, _msg: Message) {} pub fn view(&self, theme: &Theme) -> Element { let settings_container = Row::new().push(Text::new("TODO: Settings page").size(16)); diff --git a/src/page/site.rs b/src/page/site.rs index cbbd460..815b13a 100644 --- a/src/page/site.rs +++ b/src/page/site.rs @@ -13,6 +13,12 @@ pub struct SitePage { publish_page_button_state: button::State, } +impl Default for SitePage { + fn default() -> Self { + Self::new() + } +} + impl SitePage { pub fn new() -> SitePage { SitePage { @@ -23,12 +29,9 @@ impl SitePage { } pub fn update(&mut self, msg: Message) { - match msg { - Message::SitePageContentChanged(value) => { - self.input_value = value; - } - _ => {} - }; + if let Message::SitePageContentChanged(value) = msg { + self.input_value = value; + } } pub fn view(&mut self, theme: &Theme) -> Element { diff --git a/src/page/view.rs b/src/page/view.rs index 0e99bd1..ce3af25 100644 --- a/src/page/view.rs +++ b/src/page/view.rs @@ -13,6 +13,12 @@ pub struct ViewPage { content: Option, } +impl Default for ViewPage { + fn default() -> Self { + Self::new() + } +} + impl ViewPage { pub fn new() -> ViewPage { ViewPage { diff --git a/src/ui/toolbar.rs b/src/ui/toolbar.rs index 173c2f9..0302f0d 100644 --- a/src/ui/toolbar.rs +++ b/src/ui/toolbar.rs @@ -37,6 +37,12 @@ fn selected(theme: &Theme, selected: bool) -> Theme { } } +impl Default for Toolbar { + fn default() -> Self { + Self::new() + } +} + impl Toolbar { pub fn new() -> Toolbar { let buttons = vec![ @@ -94,7 +100,7 @@ impl Toolbar { Container::new( buttons - .into_iter() + .iter_mut() .fold(Row::new(), |row, page_button| { row.push(if page_button.is_disabled { Column::new().padding(2).push(