(** Report built over the differents analysis in the file *) type level = Error | Warn | Debug [@@deriving show { with_path = false }, enum, eq] type pos = Lexing.position * Lexing.position let level_of_string : string -> (level, string) result = fun level -> match String.lowercase_ascii level with | "error" -> Ok Error | "warn" -> Ok Warn | "debug" -> Ok Debug | _ -> Error (Format.sprintf "Unknown report level '%s'. Accepted values are error, warn, debug" level) let pp_pos : Format.formatter -> pos -> unit = fun f (start_pos, end_pos) -> let start_c = start_pos.Lexing.pos_cnum - start_pos.Lexing.pos_bol and end_c = end_pos.Lexing.pos_cnum - end_pos.Lexing.pos_bol and start_line = start_pos.Lexing.pos_lnum and end_line = end_pos.Lexing.pos_lnum in if start_line != end_line then Format.fprintf f "Lines %d-%d" start_line end_line else Format.fprintf f "Line %d %d:%d" start_line start_c end_c type t = { level : level; loc : pos; message : string } [@@deriving show { with_path = false }] let warn : pos -> string -> t = fun loc message -> { level = Warn; loc; message } let error : pos -> string -> t = fun loc message -> { level = Error; loc; message } let message level loc message = { level; loc; message }