///|
pub suberror PolicyError {
  Invalid(String)
  Resource(String)
  Internal(String)
} derive(Debug)

///|
fn[T] bdd_value(r : Result[T, @bdd.BddError]) -> T raise PolicyError {
  match r {
    Ok(x) => x
    Err(e) => raise Resource(@debug.to_string(e))
  }
}

///|
fn cidr_value(s : String) -> @cidr.CidrBlock raise PolicyError {
  match @cidr.CidrBlock::parse(s) {
    Ok(x) => x
    Err(e) => raise Invalid(e)
  }
}