#[derive(Debug)]
struct Hoge {
id: usize,
ok: bool,
}
impl Drop for Hoge {
fn drop(&mut self) {
assert!(self.
ok, "must call .ok() (id: {})", self.
id); }
}
impl Hoge {
fn new(id: usize) -> Self {
Self{ id, ok: false }
}
fn next(mut self, check: i32) -> Result<Self,()> {
self.ok = true;
if check < 10 {
Ok(Self{id: self.id, ok: false})
} else {
Err(())
}
}
fn ok(mut self, check: i32) -> Result<(),()> {
self.ok = true;
if check < 10 {
Ok(())
} else {
Err(())
}
}
}
fn main() {
run().unwrap();
}
fn run() -> Result<(),()> {
Hoge::new(1).next(5)?.next(8)?.next(4)?.ok(3)?;
Hoge::new(2).next(1)?.next(2)?;
Hoge::new(3).next(1)?.next(2)?.ok(3)?;
Hoge::new(4).next(1)?.next(2)?.ok(5)
}
CiNbZGVyaXZlKERlYnVnKV0Kc3RydWN0IEhvZ2UgewogICAgaWQ6IHVzaXplLAogICAgb2s6IGJvb2wsCn0KCmltcGwgRHJvcCBmb3IgSG9nZSB7CiAgICBmbiBkcm9wKCZtdXQgc2VsZikgewogICAgICAgIGFzc2VydCEoc2VsZi5vaywgIm11c3QgY2FsbCAub2soKSAoaWQ6IHt9KSIsIHNlbGYuaWQpOwogICAgfQp9CgppbXBsIEhvZ2UgewogICAgZm4gbmV3KGlkOiB1c2l6ZSkgLT4gU2VsZiB7CiAgICAgICAgU2VsZnsgaWQsIG9rOiBmYWxzZSB9CiAgICB9CiAgICBmbiBuZXh0KG11dCBzZWxmLCBjaGVjazogaTMyKSAtPiBSZXN1bHQ8U2VsZiwoKT4gewogICAgICAgIHNlbGYub2sgPSB0cnVlOwogICAgICAgIGlmIGNoZWNrIDwgMTAgewogICAgICAgICAgICBPayhTZWxme2lkOiBzZWxmLmlkLCBvazogZmFsc2V9KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEVycigoKSkKICAgICAgICB9CiAgICB9CiAgICBmbiBvayhtdXQgc2VsZiwgY2hlY2s6IGkzMikgLT4gUmVzdWx0PCgpLCgpPiB7CiAgICAgICAgc2VsZi5vayA9IHRydWU7CiAgICAgICAgaWYgY2hlY2sgPCAxMCB7CiAgICAgICAgICAgIE9rKCgpKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEVycigoKSkKICAgICAgICB9CiAgICB9Cn0KCmZuIG1haW4oKSB7CiAgICBydW4oKS51bndyYXAoKTsKfQoKZm4gcnVuKCkgLT4gUmVzdWx0PCgpLCgpPiB7CiAgICBIb2dlOjpuZXcoMSkubmV4dCg1KT8ubmV4dCg4KT8ubmV4dCg0KT8ub2soMyk/OwogICAgSG9nZTo6bmV3KDIpLm5leHQoMSk/Lm5leHQoMik/OwogICAgSG9nZTo6bmV3KDMpLm5leHQoMSk/Lm5leHQoMik/Lm9rKDMpPzsKICAgIEhvZ2U6Om5ldyg0KS5uZXh0KDEpPy5uZXh0KDIpPy5vayg1KQp9