ImNotAVirus
Return a binary tuple from a Rust NIF
Hello,
I’m trying to make a NIF that splits binary once using a delimiter (like :binary.split(bin, separator, parts: 2)) but in Rust I don’t quite understand how to use rustler::Binary, rustler::OwnedBinary and rustler::NewBinary.
Here’s the code I currently have, it’s working but it could be improved (I think):
#[rustler::nif]
fn next<'a>(env: Env<'a>, raw: Binary<'a>) -> (Option<Binary<'a>>, Binary<'a>) {
match do_next(raw.as_slice()) {
Some((packet, remaining)) => {
let mut pb = NewBinary::new(env, packet.len());
pb.as_mut_slice().copy_from_slice(packet);
let mut rb = NewBinary::new(env, remaining.len());
rb.as_mut_slice().copy_from_slice(remaining);
(Some(pb.into()), rb.into())
}
None => (None, raw)
}
}
fn do_next(raw: &[u8]) -> Option<(&[u8], &[u8])> {
let index = raw.iter().position(|&r| r == SEPARATOR);
match index {
Some(i) => Some((&raw[0..i], &raw[i + 1..])),
_ => None,
}
}
I’ve few questions:
- Why is it possible to return an
OwnedBinarybut not if it’s in a tuple ?
Example:
// This works
#[rustler::nif]
fn encrypt(raw: String) -> OwnedBinary {
let enc: Vec<u8> = do_encrypt(raw.as_bytes());
let mut binary: OwnedBinary = OwnedBinary::new(enc.len()).unwrap();
binary.as_mut_slice().copy_from_slice(&enc);
binary
}
// But this don't
// The error is: the trait bound `OwnedBinary: Encoder` is not satisfied
#[rustler::nif]
fn encrypt(raw: String) -> (OwnedBinary , OwnedBinary) {
let enc: Vec<u8> = do_encrypt(raw.as_bytes());
let mut binary: OwnedBinary = OwnedBinary::new(enc.len()).unwrap();
binary.as_mut_slice().copy_from_slice(&enc);
(binary, binary)
}
- It is possible to return a binary inside a tuple but without to manually allocate it using the
env?
Thanks in advance
Popular in Questions
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
What is the proper way to load a module from a file in to IEX?
In the python world, doing something like this pretty standard:
from ....
New
Hey all,
I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
Hello!
Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
Hello everybody,
usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1]
15:22:35.803 [error] gen_event {lager_file_backend...
New
Other popular topics
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set?
Thanks.
New
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
Hello everyone,
Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
i’m a new one to elixir
which editor can i use
vs code? or atom?
Thanks! :smiley:
New
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service.
Currently when I de...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









