neon-sys 0.1.10

Exposes Node and V8 C++ API's for use by Neon.
namespace neon {

class RustSlice {
public:
  RustSlice(const char *buffer, uint32_t length)
    : buffer_(buffer), length_(length)
  {
  }

  v8::Local<v8::String> ToJsString(v8::Isolate *isolate, const char *fallback) {
    v8::MaybeLocal<v8::String> maybe;
    v8::Local<v8::String> result;

    maybe = v8::String::NewFromUtf8(isolate, buffer_, v8::NewStringType::kNormal, length_);
    if (maybe.ToLocal(&result)) {
      return result;
    }

    maybe = v8::String::NewFromOneByte(isolate, (const uint8_t *)fallback, v8::NewStringType::kNormal);
    if (maybe.ToLocal(&result)) {
      return result;
    }

    maybe = v8::String::NewFromOneByte(isolate, (const uint8_t *)"?", v8::NewStringType::kNormal);
    maybe.ToLocal(&result);
    return result;
  }

  const char *GetBuffer() {
    return buffer_;
  }

  uint32_t GetLength() {
    return length_;
  }

private:

  const char *buffer_;
  uint32_t length_;
};


class RustString {
public:
  RustString(uint32_t length) {
    length_ = length;
    buffer_ = new char [length];
    cursor_ = 0;
  }

  ~RustString() {
    delete buffer_;
    buffer_ = nullptr;
    length_ = 0;
  }

  RustSlice Borrow() {
    return RustSlice(buffer_, length_);
  }

  char *GetBuffer() {
    return buffer_;
  }

  uint32_t GetLength() {
    return length_;
  }

  RustString& operator<<(const char *s) {
    while (*s) {
      buffer_[cursor_] = *s;
      cursor_++;
      s++;
    }
    return *this;
  }

  RustString& operator<<(RustSlice s) {
    uint32_t length = s.GetLength();
    memcpy(buffer_ + cursor_, s.GetBuffer(), length);
    cursor_ += length;
    return *this;
  }

private:

  char *buffer_;
  uint32_t length_;
  uint32_t cursor_;
};

};