use goish::prelude::*;
fn divide(a: int64, b: int64) -> (int64, error) {
if b == 0 {
return (0, errors::New("divide by zero"));
}
(a / b, nil)
}
struct Color { r: int, g: int, b: int }
fmt::stringer! {
impl Color {
fn String(&self) -> string {
fmt::Sprintf!("#%02x%02x%02x", self.r, self.g, self.b)
}
}
}
fn main() {
fmt::Println!("hello", "world", 42);
fmt::Printf!("%-8s = %d\n", "answer", 42);
let s = fmt::Sprintf!("pi = %.4f", 3.14159);
fmt::Println!(s);
let (q, err) = divide(10, 2);
if err != nil {
fmt::Println!("error:", err);
} else {
fmt::Printf!("10 / 2 = %d\n", q);
}
let (_, err) = divide(10, 0);
if err != nil {
fmt::Println!("error:", err);
}
let base = errors::New("disk full");
let wrapped = errors::Wrap(base.clone(), "save failed");
fmt::Println!("wrapped:", wrapped);
fmt::Println!("is base?", errors::Is(&wrapped, &base));
let e = fmt::Errorf!("connection to %s failed (code %d)", "db.local", 500);
fmt::Println!("formatted:", e);
let mut buf = bytes::Buffer::new();
fmt::Fprintf!(&mut buf, "logged: %s=%d", "n", 7);
fmt::Println!("buf:", buf.String());
let red = Color { r: 255, g: 0, b: 0 };
let teal = Color { r: 0, g: 128, b: 128 };
fmt::Println!("color:", red);
fmt::Printf!("teal as %%s = %s\n", teal);
}