|
| 1 | +module Layout = Pretty.Layout |
| 2 | + |
| 3 | +type 'a t = { |
| 4 | + item : 'a; |
| 5 | + layout : Pretty.Layout.t; |
| 6 | +} |
| 7 | + |
| 8 | +let issue_char = "\u{f41b}" |
| 9 | + |
| 10 | +let fmt_issue_state (state : Gh.Issue.state) = |
| 11 | + match state with |
| 12 | + | Open -> Layout.(fmt Style.issue_open issue_char) |
| 13 | + | Closed -> Layout.(fmt Style.issue_closed issue_char) |
| 14 | + |
| 15 | +let fmt_title (issue : Gh.Issue.t) = |
| 16 | + let open Layout in |
| 17 | + horizontal |
| 18 | + [ |
| 19 | + fmt_issue_state issue.state; |
| 20 | + str " "; |
| 21 | + fmt Style.secondary (Printf.sprintf "#%d " issue.number); |
| 22 | + str issue.title; |
| 23 | + str " by "; |
| 24 | + fmt Style.bold (Printf.sprintf "@%s" issue.author); |
| 25 | + ] |
| 26 | + |
| 27 | +let apply_background_color ~color text = |
| 28 | + let module Color = Pretty.Color in |
| 29 | + let color = Color.of_hex color in |
| 30 | + let foreground_suggestion = Color.foreground color in |
| 31 | + let color_code = Pretty.Color.to_escape_seq color in |
| 32 | + let text = Printf.sprintf "\027[48;%sm %s \027[0m" color_code text in |
| 33 | + (text, foreground_suggestion) |
| 34 | + |
| 35 | +let fmt_labels labels = |
| 36 | + let open Layout in |
| 37 | + let fmt_label (label : Gh.Issue.label) = |
| 38 | + let label, foreground = |
| 39 | + apply_background_color ~color:label.color label.name |
| 40 | + in |
| 41 | + let label = label ^ " " in |
| 42 | + match foreground with |
| 43 | + | `Light -> fmt Style.fg_white label |
| 44 | + | `Dark -> fmt Style.fg_black label |
| 45 | + in |
| 46 | + labels |> List.map fmt_label |> fun labels -> horizontal (str " " :: labels) |
| 47 | + |
| 48 | +let fmt_issue (issue : Gh.Issue.t) = |
| 49 | + Layout.vertical [ fmt_title issue; fmt_labels issue.labels ] |
| 50 | + |
| 51 | +let issues issue_list = |
| 52 | + let layouts = List.map fmt_issue issue_list in |
| 53 | + let max_issue_width = Extra.List.max_on Layout.width layouts in |
| 54 | + ListLabels.map2 issue_list layouts ~f:(fun issue layout -> |
| 55 | + let width = Layout.width layout in |
| 56 | + let padding_len = max_issue_width - width in |
| 57 | + let layout = |
| 58 | + if padding_len <= 0 then layout |
| 59 | + else |
| 60 | + let padding = Layout.str (Extra.String.repeat_txt padding_len " ") in |
| 61 | + Layout.(horizontal [ layout; vertical [ padding; padding ] ]) |
| 62 | + in |
| 63 | + { item = issue; layout }) |
0 commit comments