improve transparent api (#4651)
This commit is contained in:
parent
b4937b96e9
commit
0733be13a0
2 changed files with 12 additions and 421 deletions
|
@ -49,6 +49,18 @@ macro_rules! transparent_wrapper{
|
|||
pub fn into_inner(self) -> $inner{
|
||||
self.0
|
||||
}
|
||||
|
||||
#[doc(hidden)]
|
||||
#[allow(dead_code)]
|
||||
pub fn into_inner_ref(&self) -> &$inner{
|
||||
&self.0
|
||||
}
|
||||
|
||||
#[doc(hidden)]
|
||||
#[allow(dead_code)]
|
||||
pub fn into_inner_mut(&mut self) -> &mut $inner{
|
||||
&mut self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for $name{
|
||||
|
|
|
@ -1,421 +0,0 @@
|
|||
use crate::{
|
||||
opt::{Edge, KeyRange, QueryRange},
|
||||
Bytes, Datetime, Number, Object, RecordId, RecordIdKey, Uuid, Value,
|
||||
};
|
||||
use std::{collections::BTreeMap, ops::Bound};
|
||||
use surrealdb_core::{
|
||||
dbs::{Action as CoreAction, Notification as CoreNotification},
|
||||
sql::{
|
||||
Array as CoreArray, Bytes as CoreBytes, Datetime as CoreDatetime, Duration as CoreDuration,
|
||||
Edges as CoreEdges, Id, Number as CoreNumber, Object as CoreObject, Range as CoreRange,
|
||||
Strand, Table as CoreTable, Tables as CoreTables, Thing, Uuid as CoreUuid,
|
||||
Value as CoreValue,
|
||||
},
|
||||
};
|
||||
use trice::Duration;
|
||||
|
||||
use super::{Action, Notification};
|
||||
|
||||
pub(crate) trait ToCore: Sized {
|
||||
type Core;
|
||||
|
||||
fn to_core(self) -> Self::Core;
|
||||
|
||||
fn as_core(&self) -> Self::Core;
|
||||
|
||||
/// Create a lib value from it's core counterpart.
|
||||
/// Can return none if the core value cannot be turned into the core value.
|
||||
/// This can be the case with forexample value, where it's AST like values are not present on
|
||||
/// the lib value.
|
||||
fn from_core(this: Self::Core) -> Option<Self>;
|
||||
}
|
||||
|
||||
impl ToCore for Bytes {
|
||||
type Core = CoreBytes;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
CoreBytes::from(self.0)
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
self.clone().to_core()
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
Some(Self(this.into_inner()))
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Datetime {
|
||||
type Core = CoreDatetime;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
CoreDatetime::from(self.0)
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
self.clone().to_core()
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
Some(Self(this.0))
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Object {
|
||||
type Core = CoreObject;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
CoreObject::from(
|
||||
self.0
|
||||
.into_iter()
|
||||
.map(|(k, v)| (k, v.to_core()))
|
||||
.collect::<BTreeMap<String, CoreValue>>(),
|
||||
)
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
let map: BTreeMap<String, CoreValue> =
|
||||
self.0.iter().map(|(k, v)| (k.clone(), v.as_core())).collect();
|
||||
|
||||
CoreObject::from(map)
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
let mut new = BTreeMap::new();
|
||||
for (k, v) in this.0.into_iter() {
|
||||
new.insert(k, ToCore::from_core(v)?);
|
||||
}
|
||||
Some(Object(new))
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Vec<Value> {
|
||||
type Core = CoreArray;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
CoreArray::from(self.into_iter().map(ToCore::to_core).collect::<Vec<CoreValue>>())
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
CoreArray::from(self.iter().map(ToCore::as_core).collect::<Vec<CoreValue>>())
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
let len = this.0.len();
|
||||
this.0.into_iter().try_fold(Vec::<Value>::with_capacity(len), |mut acc, r| {
|
||||
acc.push(Value::from_core(r)?);
|
||||
Some(acc)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Number {
|
||||
type Core = CoreNumber;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
match self {
|
||||
Number::Float(x) => CoreNumber::Float(x),
|
||||
Number::Integer(x) => CoreNumber::Int(x),
|
||||
Number::Decimal(x) => CoreNumber::Decimal(x),
|
||||
}
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
self.clone().to_core()
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
let v = match this {
|
||||
CoreNumber::Int(x) => Number::Integer(x),
|
||||
CoreNumber::Float(x) => Number::Float(x),
|
||||
CoreNumber::Decimal(x) => Number::Decimal(x),
|
||||
_ => return None,
|
||||
};
|
||||
Some(v)
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Uuid {
|
||||
type Core = CoreUuid;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
CoreUuid::from(self)
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
self.to_core()
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
Some(this.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for String {
|
||||
type Core = Strand;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
Strand::from(self)
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
Strand::from(self.as_str())
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
Some(this.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Duration {
|
||||
type Core = CoreDuration;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
CoreDuration::from(self)
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
CoreDuration::from(*self)
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
Some(this.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for RecordId {
|
||||
type Core = Thing;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
Thing::from((self.table, self.key.to_core()))
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
Thing::from((self.table.clone(), self.key.as_core()))
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
Some(Self {
|
||||
table: this.tb,
|
||||
key: ToCore::from_core(this.id)?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for RecordIdKey {
|
||||
type Core = Id;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
match self {
|
||||
RecordIdKey::String(x) => Id::String(x),
|
||||
RecordIdKey::Integer(x) => Id::Number(x),
|
||||
RecordIdKey::Object(x) => Id::Object(x.to_core()),
|
||||
RecordIdKey::Array(x) => Id::Array(x.to_core()),
|
||||
}
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
match self {
|
||||
RecordIdKey::String(x) => Id::String(x.clone()),
|
||||
RecordIdKey::Integer(x) => Id::Number(*x),
|
||||
RecordIdKey::Object(x) => Id::Object(x.as_core()),
|
||||
RecordIdKey::Array(x) => Id::Array(x.as_core()),
|
||||
}
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
let v = match this {
|
||||
Id::String(x) => RecordIdKey::String(x),
|
||||
Id::Number(x) => RecordIdKey::Integer(x),
|
||||
Id::Object(x) => RecordIdKey::Object(ToCore::from_core(x)?),
|
||||
Id::Array(x) => RecordIdKey::Array(ToCore::from_core(x)?),
|
||||
_ => return None,
|
||||
};
|
||||
Some(v)
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Edge {
|
||||
type Core = CoreEdges;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
let from = self.from.to_core();
|
||||
let mut what = CoreTables::default();
|
||||
what.0 = self
|
||||
.tables
|
||||
.into_iter()
|
||||
.map(|x| {
|
||||
let mut t = CoreTable::default();
|
||||
t.0 = x;
|
||||
t
|
||||
})
|
||||
.collect();
|
||||
CoreEdges::new(self.dir, from, what)
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
let from = self.from.as_core();
|
||||
let mut what = CoreTables::default();
|
||||
what.0 = self
|
||||
.tables
|
||||
.iter()
|
||||
.map(|x| {
|
||||
let mut t = CoreTable::default();
|
||||
t.0 = x.clone();
|
||||
t
|
||||
})
|
||||
.collect();
|
||||
CoreEdges::new(self.dir.clone(), from, what)
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
Some(Edge {
|
||||
dir: this.dir,
|
||||
from: RecordId::from_core(this.from)?,
|
||||
tables: this.what.0.into_iter().map(|x| x.0).collect(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Notification<Value> {
|
||||
type Core = CoreNotification;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
CoreNotification::new(self.query_id.into(), self.action.to_core(), self.data.to_core())
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
CoreNotification::new(self.query_id.into(), self.action.as_core(), self.data.as_core())
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
Some(Notification {
|
||||
query_id: this.id.0,
|
||||
action: Action::from_core(this.action)?,
|
||||
data: Value::from_core(this.result)?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for QueryRange {
|
||||
type Core = CoreRange;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
CoreRange::new(
|
||||
self.table,
|
||||
self.range.start.map(|x| x.to_core()),
|
||||
self.range.end.map(|x| x.to_core()),
|
||||
)
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
self.clone().to_core()
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
let start = match this.beg {
|
||||
Bound::Included(x) => Bound::Included(RecordIdKey::from_core(x)?),
|
||||
Bound::Excluded(x) => Bound::Excluded(RecordIdKey::from_core(x)?),
|
||||
Bound::Unbounded => Bound::Unbounded,
|
||||
};
|
||||
|
||||
let end = match this.end {
|
||||
Bound::Included(x) => Bound::Included(RecordIdKey::from_core(x)?),
|
||||
Bound::Excluded(x) => Bound::Excluded(RecordIdKey::from_core(x)?),
|
||||
Bound::Unbounded => Bound::Unbounded,
|
||||
};
|
||||
|
||||
Some(QueryRange {
|
||||
table: this.tb,
|
||||
range: KeyRange {
|
||||
start,
|
||||
end,
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Action {
|
||||
type Core = CoreAction;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
match self {
|
||||
Action::Create => CoreAction::Create,
|
||||
Action::Update => CoreAction::Update,
|
||||
Action::Delete => CoreAction::Delete,
|
||||
}
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
match self {
|
||||
Action::Create => CoreAction::Create,
|
||||
Action::Update => CoreAction::Update,
|
||||
Action::Delete => CoreAction::Delete,
|
||||
}
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
match this {
|
||||
CoreAction::Create => Some(Action::Create),
|
||||
CoreAction::Update => Some(Action::Update),
|
||||
CoreAction::Delete => Some(Action::Delete),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCore for Value {
|
||||
type Core = CoreValue;
|
||||
|
||||
fn to_core(self) -> Self::Core {
|
||||
match self {
|
||||
Value::None => CoreValue::None,
|
||||
Value::Bool(x) => CoreValue::Bool(x),
|
||||
Value::Number(x) => CoreValue::Number(x.to_core()),
|
||||
Value::Object(x) => CoreValue::Object(x.to_core()),
|
||||
Value::String(x) => CoreValue::Strand(Strand::from(x)),
|
||||
Value::Array(x) => CoreValue::Array(x.to_core()),
|
||||
Value::Uuid(x) => CoreValue::Uuid(x.to_core()),
|
||||
Value::Datetime(x) => CoreValue::Datetime(x.to_core()),
|
||||
Value::Duration(x) => CoreValue::Duration(x.to_core()),
|
||||
Value::Bytes(x) => CoreValue::Bytes(x.to_core()),
|
||||
Value::RecordId(x) => CoreValue::Thing(x.to_core()),
|
||||
}
|
||||
}
|
||||
|
||||
fn as_core(&self) -> Self::Core {
|
||||
match self {
|
||||
Value::None => CoreValue::None,
|
||||
Value::Bool(x) => CoreValue::Bool(*x),
|
||||
Value::Number(x) => CoreValue::Number(x.as_core()),
|
||||
Value::Object(x) => CoreValue::Object(x.as_core()),
|
||||
Value::String(x) => CoreValue::Strand(Strand::from(x.as_str())),
|
||||
Value::Array(x) => CoreValue::Array(x.as_core()),
|
||||
Value::Uuid(x) => CoreValue::Uuid(x.as_core()),
|
||||
Value::Datetime(x) => CoreValue::Datetime(x.as_core()),
|
||||
Value::Duration(x) => CoreValue::Duration(x.as_core()),
|
||||
Value::Bytes(x) => CoreValue::Bytes(x.as_core()),
|
||||
Value::RecordId(x) => CoreValue::Thing(x.as_core()),
|
||||
}
|
||||
}
|
||||
|
||||
fn from_core(this: Self::Core) -> Option<Self> {
|
||||
let v = match this {
|
||||
CoreValue::None | CoreValue::Null => Value::None,
|
||||
CoreValue::Bool(x) => Value::Bool(x),
|
||||
CoreValue::Number(x) => Value::Number(ToCore::from_core(x)?),
|
||||
CoreValue::Object(x) => Value::Object(ToCore::from_core(x)?),
|
||||
CoreValue::Strand(x) => Value::String(ToCore::from_core(x)?),
|
||||
CoreValue::Array(x) => Value::Array(ToCore::from_core(x)?),
|
||||
CoreValue::Uuid(x) => Value::Uuid(ToCore::from_core(x)?),
|
||||
CoreValue::Datetime(x) => Value::Datetime(ToCore::from_core(x)?),
|
||||
CoreValue::Duration(x) => Value::Duration(ToCore::from_core(x)?),
|
||||
CoreValue::Bytes(x) => Value::Bytes(ToCore::from_core(x)?),
|
||||
CoreValue::Thing(x) => Value::RecordId(ToCore::from_core(x)?),
|
||||
_ => return None,
|
||||
};
|
||||
|
||||
Some(v)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue