///|
/// sentinel value for "no short flag"
let no_short : Char = '\u0000'

///|
pub fn string(
  name : String,
  short? : Char = '\u0000',
  description? : String = "",
  required? : Bool = false,
  default? : String? = None,
) -> OptionDef {
  {
    name,
    type_: StringOpt,
    short,
    description,
    required: match default {
      Some(_) => false
      None => required
    },
    default_value: default,
  }
}

///|
pub fn bool(
  name : String,
  short? : Char = '\u0000',
  description? : String = "",
) -> OptionDef {
  {
    name,
    type_: BoolOpt,
    short,
    description,
    required: false,
    default_value: None,
  }
}

///|
pub fn int(
  name : String,
  short? : Char = '\u0000',
  description? : String = "",
  required? : Bool = false,
  default? : Int? = None,
) -> OptionDef {
  {
    name,
    type_: IntOpt,
    short,
    description,
    required: match default {
      Some(_) => false
      None => required
    },
    default_value: match default {
      Some(v) => Some(v.to_string())
      None => None
    },
  }
}