Fill in section about the data model
This commit is contained in:
parent
e060046e81
commit
2fca24aeab
1 changed files with 44 additions and 1 deletions
45
README.md
45
README.md
|
|
@ -488,7 +488,50 @@ Clojure functions serialized to this type will have their arguments and return
|
|||
value exactly match the types specified and will not perform any serialization
|
||||
or deserialization at their boundaries.
|
||||
|
||||
### TODO Data Model
|
||||
### Data Model
|
||||
In addition to the macros and functions provided to build a Clojure API for
|
||||
native libraries, facilities are provided for taking data and loading all the
|
||||
symbols specified by it. This can be useful if a library provides (or an
|
||||
external provider maintains) a data representation of their API, as Clojure data
|
||||
to represent it may be programmatically generated from these sources.
|
||||
|
||||
The data to represent an API is a map with the following form:
|
||||
|
||||
```clojure
|
||||
(def strlen-libspec
|
||||
{:strlen {:type :function
|
||||
:symbol "strlen"
|
||||
:function/args [::ffi/c-string]
|
||||
:function/ret ::ffi/long}})
|
||||
```
|
||||
|
||||
Each key in this map represents a single symbol to be loaded. The value is a map
|
||||
with at least the keys `:type` and `:symbol`. These are the currently recognized
|
||||
types:
|
||||
|
||||
- function
|
||||
- varargs-factory
|
||||
- const
|
||||
- static-var
|
||||
|
||||
Each one has its own set of additional keys which can be added to the map. Both
|
||||
`function` and `varargs-factory` have the three keys `:function/args`,
|
||||
`:function/ret`, and `:function/raw-fn?`. The `const` type has `:const/type` and
|
||||
`static-var` has `:static-var/type`.
|
||||
|
||||
This data can be passed to the function `reify-libspec`, which will take the
|
||||
data and return a map from the same keys as the input map to whatever value is
|
||||
appropriate for a given symbol type (e.g. a Clojure function for `function`, a
|
||||
value for `const`, etc.).
|
||||
|
||||
```clojure
|
||||
(ffi/reify-libspec strlen-libspec)
|
||||
;; => {:strlen #function[...]}
|
||||
```
|
||||
|
||||
This functionality can be extended by specifying new types as implementations of
|
||||
the multimethod `reify-symbolspec`, although it's recommended that for any
|
||||
library authors who do so, namespaced keywords be used to name types.
|
||||
|
||||
## License
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue