summaryrefslogtreecommitdiffhomepage
path: root/dlang/README.md
blob: 124e4d6d51462ffd1b36cc22f165dbb18c6d42b8 (plain)
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
61
62
# ocda-lib, in D

The abstraction's model and both its loaders, as a dub library.

## Modules

|                 |                                                               |
|-----------------|---------------------------------------------------------------|
| `ocda.model`    | the document, the object, the eight sections. Imports nothing |
| `ocda.load_ssp` | text -> model                                                 |
| `ocda.load_db`  | sqlite -> model                                               |
| `ocda.load`     | what a path is, and loading it                                |
| `ocda.dump`     | the model written out canonically, as an oracle               |
| `ocda.sqlite`   | the sqlite3 C API, declared rather than depended upon         |

`ocda.model` importing nothing is the property that matters: a writer
depends on the model and on neither loader.

## Use

```json
"dependencies": { "ocda-lib": { "path": "../../sisudoc-ocda-lib/dlang" } }
```

```d
import ocda.load;
auto doc = load("document.ocda.db", "de");   // or "document.ssp"
foreach (obj; doc.body) { ... }
```

Link `sqlite3`; the library declares the dozen functions it needs rather
than taking a binding from the registry, so there is nothing to fetch.

## The two checks

```sh
nix build .#ocda-agree && ./result/bin/ocda-agree <doc>.ssp <doc>.ocda.db [lang]
nix build .#ocda-dump  && ./result/bin/ocda-dump [--unknown] <file> [lang]
```

`agree` loads both and compares ten fields of each object, naming the field
where they part company. `agree` found the blank-first-text-line defect and
was not enough for anything subtler.

**`ocda-dump` is the stronger check**: the whole loaded model, every field,
written out in a form fully determined by the model, so that two
implementations can be compared with `diff`. It is an oracle, not an output
format; anything reading it to reconstruct a document has misunderstood it.
It agrees byte for byte with the Gleam library's `ocda-lib dump`, which is
the point of having it.

It found four disagreements `agree` could not see. They are in the
repository README and in the history.

## Build

```sh
nix build .#ocda-agree    # the agreement check
nix build .#ocda-dump     # the canonical dump
nix develop               # ldc, dub, dtools, sqlite
dub build                 # the library
```