use core::cmp::Ordering;
use core::hash::Hasher as _;
use crate as rune;
use crate::alloc::fmt::TryWrite;
use crate::alloc::prelude::*;
use crate::alloc::Vec;
use crate::runtime::{Bytes, Formatter, Hasher, Panic, VmErrorKind, VmResult};
use crate::{ContextError, Module, Value};
#[rune::module(::std::bytes)]
pub fn module() -> Result<Module, ContextError> {
let mut m = Module::from_meta(self::module_meta)?;
m.ty::<Bytes>()?;
m.function_meta(new)?;
m.function_meta(with_capacity)?;
m.function_meta(from_vec)?;
m.function_meta(into_vec)?;
m.function_meta(as_vec)?;
m.function_meta(extend)?;
m.function_meta(extend_str)?;
m.function_meta(pop)?;
m.function_meta(push)?;
m.function_meta(remove)?;
m.function_meta(insert)?;
m.function_meta(index_get)?;
m.function_meta(index_set)?;
m.function_meta(first)?;
m.function_meta(last)?;
m.function_meta(len)?;
m.function_meta(is_empty)?;
m.function_meta(capacity)?;
m.function_meta(clear)?;
m.function_meta(reserve)?;
m.function_meta(reserve_exact)?;
m.function_meta(shrink_to_fit)?;
m.function_meta(clone__meta)?;
m.implement_trait::<Bytes>(rune::item!(::std::clone::Clone))?;
m.function_meta(partial_eq__meta)?;
m.implement_trait::<Bytes>(rune::item!(::std::cmp::PartialEq))?;
m.function_meta(eq__meta)?;
m.implement_trait::<Bytes>(rune::item!(::std::cmp::Eq))?;
m.function_meta(partial_cmp__meta)?;
m.implement_trait::<Bytes>(rune::item!(::std::cmp::PartialOrd))?;
m.function_meta(cmp__meta)?;
m.implement_trait::<Bytes>(rune::item!(::std::cmp::Ord))?;
m.function_meta(hash__meta)?;
m.function_meta(debug_fmt__meta)?;
Ok(m)
}
#[rune::function(free, path = Bytes::new)]
#[inline]
pub const fn new() -> Bytes {
Bytes::new()
}
#[rune::function(free, path = Bytes::with_capacity)]
#[inline]
pub fn with_capacity(capacity: usize) -> VmResult<Bytes> {
VmResult::Ok(vm_try!(Bytes::with_capacity(capacity)))
}
#[rune::function(free, path = Bytes::from_vec)]
#[inline]
pub fn from_vec(bytes: Vec<u8>) -> Bytes {
Bytes::from_vec(bytes)
}
#[rune::function(instance)]
#[inline]
pub fn into_vec(bytes: Bytes) -> Vec<u8> {
bytes.into_vec()
}
#[rune::function(instance)]
#[inline]
pub fn as_vec(bytes: &Bytes) -> VmResult<Vec<u8>> {
VmResult::Ok(vm_try!(Vec::try_from(bytes.as_slice())))
}
#[rune::function(instance)]
#[inline]
pub fn extend(this: &mut Bytes, other: &Bytes) -> VmResult<()> {
vm_try!(this.extend(other));
VmResult::Ok(())
}
#[rune::function(instance)]
pub fn extend_str(this: &mut Bytes, s: &str) -> VmResult<()> {
vm_try!(this.extend(s.as_bytes()));
VmResult::Ok(())
}
#[rune::function(instance)]
#[inline]
pub fn pop(this: &mut Bytes) -> Option<u8> {
this.pop()
}
#[rune::function(instance)]
#[inline]
pub fn push(this: &mut Bytes, value: u8) -> VmResult<()> {
vm_try!(this.push(value));
VmResult::Ok(())
}
#[rune::function(instance)]
fn remove(this: &mut Bytes, index: usize) -> VmResult<u8> {
if index >= this.len() {
return VmResult::err(VmErrorKind::OutOfRange {
index: index.into(),
length: this.len().into(),
});
}
let value = this.remove(index);
VmResult::Ok(value)
}
#[rune::function(instance)]
fn insert(this: &mut Bytes, index: usize, value: u8) -> VmResult<()> {
if index > this.len() {
return VmResult::err(VmErrorKind::OutOfRange {
index: index.into(),
length: this.len().into(),
});
}
vm_try!(this.insert(index, value));
VmResult::Ok(())
}
#[rune::function(instance)]
#[inline]
pub fn first(this: &Bytes) -> Option<u8> {
this.first()
}
#[rune::function(instance)]
#[inline]
pub fn last(this: &Bytes) -> Option<u8> {
this.last()
}
#[rune::function(instance)]
#[inline]
pub fn len(this: &Bytes) -> usize {
this.len()
}
#[rune::function(instance)]
#[inline]
pub fn is_empty(this: &Bytes) -> bool {
this.is_empty()
}
#[rune::function(instance)]
fn capacity(this: &Bytes) -> usize {
this.capacity()
}
#[rune::function(instance)]
fn clear(this: &mut Bytes) {
this.clear();
}
#[rune::function(instance)]
fn reserve(this: &mut Bytes, additional: usize) -> VmResult<()> {
vm_try!(this.reserve(additional));
VmResult::Ok(())
}
#[rune::function(instance)]
fn reserve_exact(this: &mut Bytes, additional: usize) -> VmResult<()> {
vm_try!(this.reserve_exact(additional));
VmResult::Ok(())
}
#[rune::function(keep, instance, protocol = CLONE)]
fn clone(this: &Bytes) -> VmResult<Bytes> {
VmResult::Ok(vm_try!(this.try_clone()))
}
#[rune::function(keep, instance, protocol = PARTIAL_EQ)]
#[inline]
fn partial_eq(this: &[u8], rhs: &[u8]) -> bool {
this.eq(rhs)
}
#[rune::function(keep, instance, protocol = EQ)]
#[inline]
fn eq(this: &[u8], rhs: &[u8]) -> bool {
this.eq(rhs)
}
#[rune::function(keep, instance, protocol = PARTIAL_CMP)]
#[inline]
fn partial_cmp(this: &[u8], rhs: &[u8]) -> Option<Ordering> {
this.partial_cmp(rhs)
}
#[rune::function(keep, instance, protocol = CMP)]
#[inline]
fn cmp(this: &[u8], rhs: &[u8]) -> Ordering {
this.cmp(rhs)
}
#[rune::function(keep, instance, protocol = HASH)]
fn hash(this: &[u8], hasher: &mut Hasher) {
hasher.write(this);
}
#[rune::function(keep, instance, protocol = DEBUG_FMT)]
#[inline]
fn debug_fmt(this: &[u8], f: &mut Formatter) -> VmResult<()> {
rune::vm_write!(f, "{this:?}")
}
#[rune::function(instance)]
fn shrink_to_fit(this: &mut Bytes) -> VmResult<()> {
vm_try!(this.shrink_to_fit());
VmResult::Ok(())
}
#[rune::function(instance, protocol = INDEX_GET)]
fn index_get(this: &Bytes, index: Value) -> VmResult<Value> {
match vm_try!(this.index_get(index)) {
Some(bytes) => VmResult::Ok(bytes),
None => VmResult::err(Panic::custom("missing bytes slice")),
}
}
#[rune::function(instance, protocol = INDEX_SET)]
fn index_set(this: &mut Bytes, index: usize, value: u8) -> VmResult<()> {
this.set(index, value)
}