///|
/// Parse a simple feature CSV: id,kind,nominal,lower,upper,datum.
pub fn parse_feature_csv(input : String) -> Array[Feature] raise {
  let result = []
  for line in input.split("\n") {
    let fields = line.trim().split(",").to_array()
    if fields.length() >= 6 && fields[0] != "id" {
      let kind = match fields[1].trim() {
        "hole" => FeatureKind::Hole
        "shaft" => FeatureKind::Shaft
        "plane" => FeatureKind::Plane
        "slot" => FeatureKind::Slot
        "circle" => FeatureKind::Circle
        "cylinder" => FeatureKind::Cylinder
        _ => FeatureKind::Datum
      }
      result.push({
        id: fields[0].trim().to_owned(),
        kind,
        nominal: @string.parse_double(fields[2].trim()),
        lower: @string.parse_double(fields[3].trim()),
        upper: @string.parse_double(fields[4].trim()),
        datum: fields[5].trim() == "true",
      })
    }
  }
  result
}