Browse Source

error-handling

Getty Ritter 3 years ago
parent
commit
d1d4a35221
3 changed files with 28 additions and 117 deletions
  1. 2 97
      Cargo.lock
  2. 2 1
      Cargo.toml
  3. 24 19
      src/main.rs

+ 2 - 97
Cargo.lock

@@ -1,20 +1,5 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-[[package]]
-name = "addr2line"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072"
-dependencies = [
- "gimli",
-]
-
-[[package]]
-name = "adler"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
-
 [[package]]
 name = "anyhow"
 version = "1.0.32"
@@ -47,20 +32,6 @@ dependencies = [
  "system-deps",
 ]
 
-[[package]]
-name = "backtrace"
-version = "0.3.50"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293"
-dependencies = [
- "addr2line",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
-]
-
 [[package]]
 name = "bitflags"
 version = "1.2.1"
@@ -99,40 +70,12 @@ version = "1.0.58"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f9a06fb2e53271d7c279ec1efea6ab691c35a2ae67ec0d91d7acec0caf13b518"
 
-[[package]]
-name = "cfg-if"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
-
 [[package]]
 name = "either"
 version = "1.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
 
-[[package]]
-name = "failure"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
-dependencies = [
- "backtrace",
- "failure_derive",
-]
-
-[[package]]
-name = "failure_derive"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
-
 [[package]]
 name = "futures"
 version = "0.3.5"
@@ -293,12 +236,6 @@ dependencies = [
  "system-deps",
 ]
 
-[[package]]
-name = "gimli"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724"
-
 [[package]]
 name = "gio"
 version = "0.9.0"
@@ -447,12 +384,13 @@ dependencies = [
 name = "i-am-legend"
 version = "0.1.0"
 dependencies = [
+ "anyhow",
  "cairo-rs",
- "failure",
  "gio",
  "gtk",
  "pango",
  "pangocairo",
+ "thiserror",
 ]
 
 [[package]]
@@ -476,21 +414,6 @@ version = "2.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
 
-[[package]]
-name = "miniz_oxide"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be0f75932c1f6cfae3c04000e40114adf955636e19040f9c0a2c380702aa1c7f"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "object"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ab52be62400ca80aa00285d25253d7f7c437b7375c4de678f5405d3afe82ca5"
-
 [[package]]
 name = "once_cell"
 version = "1.4.0"
@@ -650,12 +573,6 @@ dependencies = [
  "proc-macro2",
 ]
 
-[[package]]
-name = "rustc-demangle"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
-
 [[package]]
 name = "serde"
 version = "1.0.114"
@@ -697,18 +614,6 @@ dependencies = [
  "unicode-xid",
 ]
 
-[[package]]
-name = "synstructure"
-version = "0.12.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "unicode-xid",
-]
-
 [[package]]
 name = "system-deps"
 version = "1.3.2"

+ 2 - 1
Cargo.toml

@@ -7,9 +7,10 @@ edition = "2018"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-failure = "*"
 pango = "*"
 pangocairo = "*"
+thiserror = "*"
+anyhow = "*"
 
 [dependencies.cairo-rs]
 version = "*"

+ 24 - 19
src/main.rs

@@ -1,3 +1,4 @@
+use anyhow::{Result, bail, anyhow};
 use gtk::{
     Application,
     ApplicationWindow,
@@ -16,31 +17,34 @@ use std::rc::Rc;
 use std::cell::RefCell;
 
 
-struct Legend {
+struct AppData {
     symbol: char,
     color: (f64, f64, f64),
 }
 
-impl Legend {
-    fn draw_to_file(&self) {
-        let f = std::fs::File::create("samp.svg").unwrap();
+impl AppData {
+    fn draw_to_file(&self) -> Result<()> {
+        let f = std::fs::File::create("samp.svg")?;
         let surf = cairo::SvgSurface::for_stream(
             100.0,
             100.0,
             f,
-        ).unwrap();
-        self.render(&cairo::Context::new(&surf));
-        surf.finish_output_stream().unwrap();
+        )?;
+        self.render(&cairo::Context::new(&surf))?;
+        if let Err(err) = surf.finish_output_stream() {
+            bail!(err.error);
+        };
+        Ok(())
     }
 
-    fn render(&self, ctx: &cairo::Context) -> () {
+    fn render(&self, ctx: &cairo::Context) -> Result<()> {
         ctx.set_source_rgb(self.color.0, self.color.1, self.color.2);
         ctx.paint();
 
         ctx.set_source_rgb(0., 0., 0.);
 
         ctx.move_to(0.0, -23.0);
-        let layout = pangocairo::functions::create_layout(&ctx).unwrap();
+        let layout = pangocairo::functions::create_layout(&ctx).ok_or_else(|| anyhow!("Could not create layout"))?;
         layout.set_width(100 * 1024);
         layout.set_alignment(pango::Alignment::Center);
         let font = pango::FontDescription::from_string("Fira Sans 92");
@@ -48,13 +52,10 @@ impl Legend {
 
         layout.set_text(&self.symbol.to_string());
         pangocairo::functions::show_layout(&ctx, &layout);
+        Ok(())
     }
 }
 
-struct AppData {
-    legend: Legend,
-}
-
 #[derive(Clone)]
 struct App {
     data: Rc<RefCell<AppData>>,
@@ -62,11 +63,11 @@ struct App {
 
 impl App {
     fn new() -> App {
-        let legend = Legend {
+        let app_data = AppData {
             symbol: 'X',
             color: (0.5, 0.5, 0.5),
         };
-        let data = Rc::new(RefCell::new(AppData { legend }));
+        let data = Rc::new(RefCell::new(app_data));
         App { data }
     }
 }
@@ -90,14 +91,18 @@ fn mk_app(app: &gtk::Application) {
 
     let canvas = gtk::DrawingArea::new();
     let copy = app.clone();
-    canvas.connect_draw(move |cv, ctx| {
-        copy.data.borrow_mut().legend.render(ctx);
+    canvas.connect_draw(move |_cv, ctx| {
+        if let Err(err) = copy.data.borrow_mut().render(ctx) {
+            eprintln!("Error in rendering: {}", err);
+        }
         gtk::Inhibit(false)
     });
     flow.pack_start(&canvas, true, true, 0);
 
     button.connect_clicked(move |_| {
-        app.data.borrow_mut().legend.draw_to_file();
+        if let Err(err) = app.data.borrow_mut().draw_to_file() {
+            eprintln!("Error in rendering: {}", err);
+        }
     });
 
     window.add(&flow);
@@ -107,7 +112,7 @@ fn mk_app(app: &gtk::Application) {
 fn mk_icon_choice(choice: char, cell: App) -> gtk::Button {
     let button = gtk::Button::with_label(&choice.to_string());
     button.connect_clicked(move |_| {
-        cell.data.borrow_mut().legend.symbol = choice;
+        cell.data.borrow_mut().symbol = choice;
         println!("Choosing '{}'", choice);
     });
     button