Source file URI_scheme.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
open Forester_prelude
let named_uri ~base name =
URI.resolve ~base @@
let path =
if Filename.extension name = "" then [name; ""] else [name]
in
URI.make ~path ()
let last_segment str =
str
|> String.split_on_char '/'
|> List.rev
|> List.hd
let name (uri : URI.t) : string =
uri
|> URI.path_components
|> List.filter (fun x -> not (x = ""))
|> List.rev
|> List.hd
let split_addr (uri : URI.t) : (string option * int) option =
let name = name uri in
let date_regex = Str.regexp {|^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$|} in
if Str.string_match date_regex name 0 then None
else
match String.rindex_opt name '-' with
| Some i ->
let prefix = String.sub name 0 i
and suffix = String.sub name (i + 1) (String.length name - i - 1)
in
let@ key = Option.map @~ BaseN.Base36.int_of_string suffix in
Some prefix, key
| _ ->
let@ key = Option.map @~ BaseN.Base36.int_of_string name in
None, key
let lsp_uri_to_uri ~(base : URI.t) (uri : Lsp.Uri.t) : URI.t =
let uri =
uri
|> Lsp.Uri.to_path
|> Filename.chop_extension
|> last_segment
|> named_uri ~base
in
uri
let path_to_uri ~(base : URI.t) str =
str
|> last_segment
|> Filename.chop_extension
|> named_uri ~base