mock_csv/lib/ast.ml
2024-12-11 08:33:41 +01:00

74 lines
1.8 KiB
OCaml

type data =
| Columns of column list
and column =
| Column of string * data_type * values (*name * type * value/range *)
and data_type =
| Int
| String
| Date
and values =
| Range of string * string
| Values of string list
let random_int lower_bound upper_bound =
let i = Random.int (upper_bound +1 - lower_bound) + lower_bound in
string_of_int i
let random_string values =
let len = List.length values in
let idx = Random.int len in
List.nth values idx
let generate_row column =
match column with
| Column(_, Int, Range(min, max)) ->
let lower_bound = int_of_string min in
let upper_bound = int_of_string max in
random_int lower_bound upper_bound
| Column(_, String, Values(values)) ->
random_string values
| _ -> failwith "Invalid column"
let get_headers columns =
let rec aux cols =
match cols with
| [] -> []
| [Column(name, _, _)] -> [name]
| Column(name, _, _)::l -> name::(aux l)
in
match columns with
| Columns(cols) -> aux cols
let generate_rows columns n =
let aux col =
match col with
| Column(_, Int, Range(min, max)) ->
let lower_bound = int_of_string min in
let upper_bound = int_of_string max in
random_int lower_bound upper_bound
| Column(_, String, Values(values)) ->
random_string values
| _ -> failwith "Wrong column specification"
in
let rec aux1 cols =
match cols with
| [] -> []
| [col] -> [aux col]
| col :: l -> (aux col)::(aux1 l)
in
let rec aux2 cols n =
match n with
| 0 -> []
| n -> (aux1 cols)::(aux2 cols (n-1))
in
aux2 columns n
let generate_csv columns delim =
let header_list = get_headers columns in
let header = String.concat delim header_list in
print_string header