Read Tuples / Records from CSV using csv
    Task
    
Data Formats / CSV / Read Tuples / Records from CSV
Opam Packages Used
- csv Tested with version: 2.4 — Used libraries: csv
Code 
  
  
  
    Cleaner syntax for Result.bind
let ( let* ) = Result.bind
Core types
type color = Red | Yellow | Blue
type fruit = {
  id : int;
  name : string;
  color : color;
}
String representation of colors
let show_color = function
  | Red -> "Red"
  | Yellow -> "Yellow"
  | Blue -> "Blue"
Parsing functions returning Results
let parse_color = function
  | "Red" -> Ok Red
  | "Yellow" -> Ok Yellow
  | "Blue" -> Ok Blue
  | _ -> Error `Unknown_color
let parse_id raw_id =
  raw_id
  |> int_of_string_opt
  |> Option.to_result ~none:`Invalid_id
let parse_name = function
  | "" -> Error `Missing_name
  | n -> Ok n
Parse a CSV row into a fruit record
let parse_row row =
  let* id =
    Csv.Row.find row "id" |> parse_id
  in
  let* name =
    Csv.Row.find row "name" |> parse_name
  in
  let* color =
    Csv.Row.find row "color" |> parse_color
  in
  Ok { id; name; color }
Parse CSV string into list of fruit results
let parse_fruits csv_str =
  csv_str
  |> Csv.of_string ~has_header:true
  |> Csv.Rows.input_all
  |> List.map parse_row
let sample_csv =
  {|"id","name","color",
  "1","apple","Red",
  "2","lemon","Yellow",
  "3","berry","Blue",|}
Main processing
let () =
  parse_fruits sample_csv
  |> List.iter (function
    | Ok fruit ->
        Printf.printf "%d %s %s\n"
          fruit.id
          fruit.name
          (show_color fruit.color)
    | Error `Invalid_id ->
        print_endline "Invalid_id"
    | Error `Unknown_color ->
        print_endline "Unknown_color"
    | Error `Missing_name ->
        print_endline "Missing_name")