Commit
+32 -5 +/-2 browse
1 | diff --git a/lib/manifest.ml b/lib/manifest.ml |
2 | index 1fa6d1f..a4a6253 100644 |
3 | --- a/lib/manifest.ml |
4 | +++ b/lib/manifest.ml |
5 | @@ -102,6 +102,7 @@ let exists ~path manifest = |
6 | |> List.exists ~f:(fun item -> item |> to_path ~manifest |> String.equal path) |
7 | |
8 | let find ~path manifest = |
9 | + (* find exactly one item, duplicates are unallowed *) |
10 | manifest.items |
11 | |> List.find ~f:(fun item -> |
12 | let file_path = item |> to_path ~manifest in |
13 | @@ -137,3 +138,20 @@ let insert ~path ~slug ~title ~description ~tags manifest = |
14 | else |
15 | let items = item :: manifest.items in |
16 | { items } |
17 | + |
18 | + let remove ~path manifest = |
19 | + match manifest |> find ~path with |
20 | + | Some item -> |
21 | + let others = manifest |> list ~path:(item |> to_path ~manifest) in |
22 | + if Int.is_positive (List.length others) then |
23 | + failwith "will not delete recursively" |
24 | + else |
25 | + let items = |
26 | + manifest.items |
27 | + |> List.filter ~f:(fun item -> |
28 | + phys_equal |
29 | + (Filename.equal path (item |> to_path ~manifest)) |
30 | + false) |
31 | + in |
32 | + { items } |
33 | + | None -> failwith "not found" |
34 | diff --git a/test/manifest_test.ml b/test/manifest_test.ml |
35 | index 45ead24..5126c3c 100644 |
36 | --- a/test/manifest_test.ml |
37 | +++ b/test/manifest_test.ml |
38 | @@ -16,7 +16,6 @@ let test_manifest () = |
39 | |> Manifest.insert ~path:"/fuu" ~slug:"note-00000000-1.md" ~title:"bar" |
40 | ~description:"" ~tags:[] |
41 | in |
42 | - print_endline (Manifest.to_string manifest); |
43 | let result = manifest |> Manifest.find ~path:"/fuu/bar" in |
44 | Alcotest.(check bool) "manifest loaded" (result |> Option.is_some) true; |
45 | let result_path = Option.value_exn result |> Manifest.to_path ~manifest in |
46 | @@ -27,10 +26,20 @@ let test_manifest () = |
47 | ~description:"" ~tags:[] |
48 | in |
49 | let results = manifest |> Manifest.list ~path:"/fuu" in |
50 | - Alcotest.(check int) "n_results" 2 (List.length results) |
51 | + Alcotest.(check int) "n_results" 2 (List.length results); |
52 | + let manifest = |
53 | + manifest |
54 | + |> Manifest.insert ~path:"/fuu/bar" ~slug:"note-00000000-3.md" ~title:"qux" |
55 | + ~description:"" ~tags:[] |
56 | + in |
57 | + let results = manifest |> Manifest.list ~path:"/fuu/bar" in |
58 | + Alcotest.(check int) "n_results" 1 (List.length results); |
59 | + Alcotest.(check int) "n_items" 4 (List.length manifest.items); |
60 | + print_endline (Manifest.to_string manifest); |
61 | + let manifest = manifest |> Manifest.remove ~path:"/fuu/bar/qux" in |
62 | + print_endline (Manifest.to_string manifest); |
63 | + Alcotest.(check int) "remove" 3 (List.length manifest.items) |
64 | |
65 | let () = |
66 | Alcotest.run "Config" |
67 | - [ |
68 | - ("load", [ Alcotest.test_case "test manifest" `Quick test_manifest ]); |
69 | - ] |
70 | + [ ("load", [ Alcotest.test_case "test manifest" `Quick test_manifest ]) ] |