diff options
Diffstat (limited to 'src/libstore/rust.hh')
-rw-r--r-- | src/libstore/rust.hh | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/libstore/rust.hh b/src/libstore/rust.hh new file mode 100644 index 000000000..7e6c2f54d --- /dev/null +++ b/src/libstore/rust.hh @@ -0,0 +1,44 @@ +#include "serialise.hh" + +namespace rust { + +// Depending on the internal representation of Rust slices is slightly +// evil... +template<typename T> struct Slice +{ + T * ptr; + size_t size; + + Slice(T * ptr, size_t size) : ptr(ptr), size(size) + { + assert(ptr); + } +}; + +struct StringSlice : Slice<char> +{ + StringSlice(const std::string & s): Slice((char *) s.data(), s.size()) {} +}; + +struct Source +{ + size_t (*fun)(void * source_this, rust::Slice<uint8_t> data); + nix::Source * _this; + + Source(nix::Source & _this) + : fun(sourceWrapper), _this(&_this) + {} + + // FIXME: how to propagate exceptions? + static size_t sourceWrapper(void * _this, rust::Slice<uint8_t> data) + { + auto n = ((nix::Source *) _this)->read(data.ptr, data.size); + return n; + } +}; + +} + +extern "C" { + bool unpack_tarfile(rust::Source source, rust::StringSlice dest_dir); +} |