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
|
value exactly match the types specified and will not perform any serialization
|
||||||
or deserialization at their boundaries.
|
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
|
## License
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue