forstio/README.md

78 lines
2.6 KiB
Markdown
Raw Normal View History

2020-07-27 15:50:46 +02:00
# kelgin
2020-07-16 15:02:50 +02:00
2020-11-15 15:58:55 +01:00
Asynchronous framework mostly inspired by [Capn'Proto](https://github.com/capnproto/capnproto) with the key difference of not
using Promises, but more reusable Pipelines/Conveyors. This introduces some challenges since I can't assume that only one
2021-11-29 21:42:30 +01:00
element gets passed along the chain, but it is managable. The advantage is that you have zero heap overhead by recreating the chain after every use.
2020-11-15 15:58:55 +01:00
2021-11-29 21:42:30 +01:00
Very early stage. I am currently rewriting my software to find a good interface solution by checking if I am comfortable with the current design.
2020-11-15 15:58:55 +01:00
# Dependencies
You will need
2021-12-25 15:15:03 +01:00
* A compiler (std=c++20) (g++/clang++)
2020-11-15 15:58:55 +01:00
* scons
2021-11-29 21:42:30 +01:00
* gnutls
2020-11-15 15:58:55 +01:00
2021-12-25 15:15:03 +01:00
Currently the build script explicitly calls clang++ due to some occasional compiler error on archlinux with g++.
2020-11-15 15:58:55 +01:00
Optional dependencies are
* clang-format
# Build
Execute `scons`.
It's that simple.
`scons test` build the test cases.
`scons format` formats the sources.
`scons install` installs the library + headers locally.
2021-11-29 21:42:30 +01:00
# Schema Structure
2021-12-25 15:15:03 +01:00
Message description currently is achieved by a series of templated schema classes found in ```kelgin/schema.h``` as seen below
2021-11-29 21:42:30 +01:00
```
2021-12-25 15:15:03 +01:00
using BasicStruct = schema::Struct<
schema::NamedMember<Int32, "foo">,
schema::NamedMember<String, "bar">
2021-11-29 21:42:30 +01:00
>;
```
2021-12-25 15:15:03 +01:00
These schema classes are just meant to describe the schema itself. By itself, it can't do anything.
For a message we build
Using those schemas and appropriate container classes, we can now build a message class
2021-11-29 21:42:30 +01:00
```
2021-12-25 15:18:24 +01:00
HeapMessageRoot<BasicStruct, MessageContainer<BasicStruct>> buildBasicMessage(){
2021-12-25 15:15:03 +01:00
auto root = heapMessageRoot<BasicStruct>();
// This is equivalent to
// auto root = heapMessageRoot<BasicStruct, MessageContainer<BasicStruct>>();
auto builder = root.build();
auto bar_build = builder.init<"bar">().set("banana");
auto foo_build = builder.init<"foo">().set(5);
return root;
}
```
2021-11-29 21:42:30 +01:00
2021-12-25 15:15:03 +01:00
The current default message container stores each value in stl containers as `std::string`, `std::vector`, `std::tuple`, `std::variant`
or in its primitive form.
Though it is planned to allow storing those directly in buffers.
2021-11-29 21:42:30 +01:00
2020-11-15 15:58:55 +01:00
# Examples
Currently no examples except in test.
2021-11-29 21:42:30 +01:00
But [kelgin-graphics](https://github.com/keldu/kelgin-graphics) contains some programs which heavily use
this library. Though no schema or io features are used there.
2020-11-15 15:58:55 +01:00
# Roadmap
* Zerocopy for message templates during parsing
2021-12-25 15:15:03 +01:00
* Tls with gnutls (Client side partly done. Server side missing)
2020-11-15 15:58:55 +01:00
* Windows/Mac Support
* Multithreaded conveyor communication
2020-11-15 16:24:52 +01:00
* Logger implementation
2021-12-25 15:15:03 +01:00
* Reintroduce JSON without dynamic message parsing or at least with more streaming support