#![cfg_attr(feature = "rpc_try", feature(try_trait))]
extern crate byteorder;
#[cfg(any(feature="quickcheck", test))]
extern crate quickcheck;
#[cfg(feature = "rpc")]
extern crate futures;
#[cfg(target_endian = "little")]
#[macro_export]
macro_rules! capnp_word {
($b0:expr, $b1:expr, $b2:expr, $b3:expr,
$b4:expr, $b5:expr, $b6:expr, $b7:expr) => (
$crate::Word {
raw_content: (($b0 as u64) << 0) + (($b1 as u64) << 8) +
(($b2 as u64) << 16) + (($b3 as u64) << 24) +
(($b4 as u64) << 32) + (($b5 as u64) << 40) +
(($b6 as u64) << 48) + (($b7 as u64) << 56)
}
)
}
#[cfg(target_endian = "big")]
#[macro_export]
macro_rules! capnp_word {
($b0:expr, $b1:expr, $b2:expr, $b3:expr,
$b4:expr, $b5:expr, $b6:expr, $b7:expr) => (
$crate::Word {
raw_content: (($b7 as u64) << 0) + (($b6 as u64) << 8) +
(($b5 as u64) << 16) + (($b4 as u64) << 24) +
(($b3 as u64) << 32) + (($b2 as u64) << 40) +
(($b1 as u64) << 48) + (($b0 as u64) << 56)
}
)
}
pub mod any_pointer;
pub mod any_pointer_list;
pub mod capability;
pub mod capability_list;
pub mod constant;
pub mod data;
pub mod data_list;
pub mod enum_list;
pub mod list_list;
pub mod message;
pub mod primitive_list;
pub mod private;
pub mod raw;
pub mod serialize;
pub mod serialize_packed;
pub mod struct_list;
pub mod text;
pub mod text_list;
pub mod traits;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub struct Word {
#[doc(hidden)]
pub raw_content: u64,
}
impl Word {
pub fn allocate_zeroed_vec(length: usize) -> Vec<Word> {
let mut result : Vec<Word> = Vec::with_capacity(length);
unsafe {
result.set_len(length);
let p : *mut u8 = result.as_mut_ptr() as *mut u8;
::std::ptr::write_bytes(p, 0u8, length * ::std::mem::size_of::<Word>());
}
result
}
pub unsafe fn bytes_to_words<'a>(bytes: &'a [u8]) -> &'a [Word] {
::std::slice::from_raw_parts(bytes.as_ptr() as *const Word, bytes.len() / 8)
}
pub unsafe fn bytes_to_words_mut<'a>(bytes: &'a mut [u8]) -> &'a mut [Word] {
::std::slice::from_raw_parts_mut(bytes.as_ptr() as *mut Word, bytes.len() / 8)
}
pub fn words_to_bytes<'a>(words: &'a [Word]) -> &'a [u8] {
unsafe {
::std::slice::from_raw_parts(words.as_ptr() as *const u8, words.len() * 8)
}
}
pub fn words_to_bytes_mut<'a>(words: &'a mut [Word]) -> &'a mut [u8] {
unsafe {
::std::slice::from_raw_parts_mut(words.as_mut_ptr() as *mut u8, words.len() * 8)
}
}
}
#[cfg(any(feature="quickcheck", test))]
impl quickcheck::Arbitrary for Word {
fn arbitrary<G: quickcheck::Gen>(g: &mut G) -> Word {
Word { raw_content: quickcheck::Arbitrary::arbitrary(g) }
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct MessageSize {
pub word_count: u64,
pub cap_count: u32
}
impl MessageSize {
pub fn plus_eq(&mut self, other : MessageSize) {
self.word_count += other.word_count;
self.cap_count += other.cap_count;
}
}
#[derive(PartialEq, Clone, Copy, Debug)]
pub struct NotInSchema(pub u16);
impl ::std::fmt::Display for NotInSchema {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::result::Result<(), ::std::fmt::Error> {
write!(fmt, "Enum value or union discriminant {} was not present in the schema.", self.0)
}
}
impl ::std::error::Error for NotInSchema {
fn description<'a>(&'a self) -> &'a str {
"Enum value or union disriminant was not present in schema."
}
}
pub type Result<T> = ::std::result::Result<T, Error>;
#[derive(Debug, Clone)]
pub struct Error {
pub kind: ErrorKind,
pub description: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ErrorKind {
Failed,
Overloaded,
Disconnected,
Unimplemented,
}
impl Error {
pub fn failed(description: String) -> Error {
Error { description: description, kind: ErrorKind::Failed }
}
pub fn overloaded(description: String) -> Error {
Error { description: description, kind: ErrorKind::Overloaded }
}
pub fn disconnected(description: String) -> Error {
Error { description: description, kind: ErrorKind::Disconnected }
}
pub fn unimplemented(description: String) -> Error {
Error { description: description, kind: ErrorKind::Unimplemented }
}
}
impl ::std::convert::From<::std::io::Error> for Error {
fn from(err: ::std::io::Error) -> Error {
use std::io;
let kind = match err.kind() {
io::ErrorKind::TimedOut => ErrorKind::Overloaded,
io::ErrorKind::BrokenPipe |
io::ErrorKind::ConnectionRefused |
io::ErrorKind::ConnectionReset |
io::ErrorKind::ConnectionAborted |
io::ErrorKind::NotConnected => ErrorKind::Disconnected,
_ => ErrorKind::Failed,
};
Error { description: format!("{}", err), kind: kind }
}
}
impl ::std::convert::From<::std::string::FromUtf8Error> for Error {
fn from(err: ::std::string::FromUtf8Error) -> Error {
Error::failed(format!("{}", err))
}
}
impl ::std::convert::From<::std::str::Utf8Error> for Error {
fn from(err: ::std::str::Utf8Error) -> Error {
Error::failed(format!("{}", err))
}
}
#[cfg(feature = "rpc")]
impl ::std::convert::From<futures::sync::oneshot::Canceled> for Error {
fn from(_e: futures::sync::oneshot::Canceled) -> Error {
Error::failed(format!("oneshot was canceled"))
}
}
impl ::std::convert::From<NotInSchema> for Error {
fn from(e: NotInSchema) -> Error {
Error::failed(format!("Enum value or union discriminant {} was not present in schema.", e.0))
}
}
impl ::std::fmt::Display for Error {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::result::Result<(), ::std::fmt::Error> {
write!(fmt, "{:?}: {}", self.kind, self.description)
}
}
impl ::std::error::Error for Error {
fn description(&self) -> &str {
&self.description
}
fn cause(&self) -> Option<&::std::error::Error> {
None
}
}
pub enum OutputSegments<'a> {
SingleSegment([&'a [Word]; 1]),
MultiSegment(Vec<&'a [Word]>),
}
impl <'a> ::std::ops::Deref for OutputSegments<'a> {
type Target = [&'a [Word]];
fn deref<'b>(&'b self) -> &'b [&'a [Word]] {
match *self {
OutputSegments::SingleSegment(ref s) => {
s
}
OutputSegments::MultiSegment(ref v) => {
v
}
}
}
}
impl<'s> message::ReaderSegments for OutputSegments<'s> {
fn get_segment<'a>(&'a self, id: u32) -> Option<&'a [Word]> {
match *self {
OutputSegments::SingleSegment(ref s) => {
s.get(id as usize).map(|slice| *slice)
}
OutputSegments::MultiSegment(ref v) => {
v.get(id as usize).map(|slice| *slice)
}
}
}
}