1
0
dust/src/value/mod.rs

925 lines
27 KiB
Rust
Raw Normal View History

2023-08-28 14:12:41 +00:00
//! Types that represent runtime values.
2023-08-22 15:40:50 +00:00
use crate::{
error::{Error, Result},
2023-10-10 17:29:11 +00:00
AbstractTree, Function, Identifier, Table, ValueType, VariableMap,
2023-08-22 15:40:50 +00:00
};
use json::JsonValue;
use serde::{
de::{MapAccess, SeqAccess, Visitor},
ser::SerializeTuple,
Deserialize, Serialize, Serializer,
};
use tree_sitter::Node;
2023-08-22 15:40:50 +00:00
use std::{
cmp::Ordering,
2023-10-10 17:29:11 +00:00
collections::BTreeMap,
2023-08-22 15:40:50 +00:00
convert::TryFrom,
fmt::{self, Display, Formatter},
marker::PhantomData,
2023-10-10 17:29:11 +00:00
ops::{Add, AddAssign, Range, Sub, SubAssign},
2023-08-22 15:40:50 +00:00
};
pub mod function;
pub mod table;
pub mod value_type;
pub mod variable_map;
/// Whale value representation.
///
/// Every whale variable has a key and a Value. Variables are represented by
/// storing them in a VariableMap. This means the map of variables is itself a
/// value that can be treated as any other.
2023-10-10 17:29:11 +00:00
#[derive(Debug, Clone, Default)]
2023-08-22 15:40:50 +00:00
pub enum Value {
List(Vec<Value>),
Map(VariableMap),
Table(Table),
Function(Function),
2023-10-05 12:03:14 +00:00
String(String),
Float(f64),
Integer(i64),
Boolean(bool),
#[default]
Empty,
2023-08-22 15:40:50 +00:00
}
2023-10-10 17:29:11 +00:00
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
pub struct ValueNode {
value_type: ValueType,
start_byte: usize,
end_byte: usize,
}
2023-10-05 12:18:33 +00:00
2023-10-10 17:29:11 +00:00
impl ValueNode {
pub fn byte_range(&self) -> Range<usize> {
self.start_byte..self.end_byte
}
}
2023-10-05 12:18:33 +00:00
2023-10-10 17:29:11 +00:00
impl AbstractTree for ValueNode {
fn from_syntax_node(source: &str, node: Node) -> Result<Self> {
let value_type = match node.kind() {
"integer" => ValueType::Integer,
"float" => ValueType::Float,
"string" => ValueType::String,
"boolean" => ValueType::Boolean,
"empty" => ValueType::Empty,
2023-09-29 12:59:09 +00:00
"list" => {
2023-10-10 17:29:11 +00:00
let mut child_nodes = Vec::new();
2023-09-29 12:59:09 +00:00
2023-10-10 17:29:11 +00:00
for index in 0..node.child_count() - 1 {
let child_syntax_node = node.child(index).unwrap();
let child_value = ValueNode::from_syntax_node(source, child_syntax_node)?;
2023-09-29 12:59:09 +00:00
2023-10-10 17:29:11 +00:00
child_nodes.push(child_value);
2023-09-29 12:59:09 +00:00
}
2023-10-10 17:29:11 +00:00
ValueType::ListExact(child_nodes)
2023-09-29 12:59:09 +00:00
}
2023-10-10 17:29:11 +00:00
"table" => ValueType::Table,
"map" => {
let mut child_nodes = BTreeMap::new();
let mut current_key = "".to_string();
2023-09-29 20:33:46 +00:00
2023-10-10 17:29:11 +00:00
for index in 0..node.child_count() - 1 {
let child_syntax_node = node.child(index).unwrap();
2023-10-03 03:19:01 +00:00
2023-10-10 17:29:11 +00:00
if child_syntax_node.kind() == "identifier" {
current_key =
Identifier::from_syntax_node(source, child_syntax_node)?.take_inner();
2023-10-03 03:19:01 +00:00
}
2023-10-10 17:29:11 +00:00
if child_syntax_node.kind() == "value" {
let child_value = ValueNode::from_syntax_node(source, child_syntax_node)?;
let key = current_key.clone();
2023-10-03 03:19:01 +00:00
2023-10-10 17:29:11 +00:00
child_nodes.insert(key, child_value);
2023-10-03 03:19:01 +00:00
}
}
2023-10-10 17:29:11 +00:00
ValueType::Map(child_nodes)
2023-09-29 20:33:46 +00:00
}
2023-10-10 17:29:11 +00:00
"function" => ValueType::Function,
_ => {
return Err(Error::UnexpectedSyntaxNode {
expected:
"string, integer, float, boolean, list, table, map, function or empty",
actual: node.kind(),
location: node.start_position(),
relevant_source: source[node.byte_range()].to_string(),
})
2023-09-30 22:07:12 +00:00
}
2023-10-10 17:29:11 +00:00
};
2023-09-30 21:52:37 +00:00
2023-10-10 17:29:11 +00:00
Ok(ValueNode {
value_type,
start_byte: node.start_byte(),
end_byte: node.end_byte(),
})
}
2023-09-30 21:52:37 +00:00
2023-10-10 17:29:11 +00:00
fn run(&self, source: &str, context: &mut VariableMap) -> Result<Value> {
let value_source = &source[self.byte_range()];
let value = match &self.value_type {
ValueType::Any => todo!(),
ValueType::String => Value::String(value_source.to_owned()),
ValueType::Float => Value::Float(value_source.parse().unwrap()),
ValueType::Integer => Value::Integer(value_source.parse().unwrap()),
ValueType::Boolean => Value::Boolean(value_source.parse().unwrap()),
ValueType::ListExact(nodes) => {
let mut values = Vec::with_capacity(nodes.len());
for node in nodes {
let value = node.run(source, context)?;
values.push(value);
2023-09-30 21:52:37 +00:00
}
2023-10-10 17:29:11 +00:00
Value::List(values)
2023-09-30 21:52:37 +00:00
}
2023-10-10 17:29:11 +00:00
ValueType::Empty => Value::Empty,
ValueType::Map(nodes) => {
let mut values = VariableMap::new();
2023-09-29 03:29:50 +00:00
2023-10-10 17:29:11 +00:00
for (key, node) in nodes {
let value = node.run(source, context)?;
2023-10-03 03:19:01 +00:00
2023-10-10 17:29:11 +00:00
values.set_value(key.clone(), value)?;
}
2023-10-03 03:19:01 +00:00
2023-10-10 17:29:11 +00:00
Value::Map(values)
2023-10-03 03:19:01 +00:00
}
2023-10-10 17:29:11 +00:00
ValueType::Table => todo!(),
ValueType::Function => todo!(),
};
2023-10-03 03:19:01 +00:00
2023-10-10 17:29:11 +00:00
Ok(value)
2023-10-02 19:19:48 +00:00
}
2023-10-10 17:29:11 +00:00
}
2023-10-02 19:19:48 +00:00
2023-10-10 17:29:11 +00:00
impl Value {
2023-08-22 15:40:50 +00:00
pub fn value_type(&self) -> ValueType {
ValueType::from(self)
}
pub fn is_table(&self) -> bool {
matches!(self, Value::Table(_))
}
pub fn is_string(&self) -> bool {
2023-10-05 12:03:14 +00:00
matches!(self, Value::String(_))
2023-08-22 15:40:50 +00:00
}
pub fn is_integer(&self) -> bool {
2023-10-05 12:03:14 +00:00
matches!(self, Value::Integer(_))
2023-08-22 15:40:50 +00:00
}
pub fn is_float(&self) -> bool {
2023-10-05 12:03:14 +00:00
matches!(self, Value::Float(_))
2023-08-22 15:40:50 +00:00
}
pub fn is_number(&self) -> bool {
2023-10-05 12:03:14 +00:00
matches!(self, Value::Integer(_) | Value::Float(_))
2023-08-22 15:40:50 +00:00
}
pub fn is_boolean(&self) -> bool {
2023-10-05 12:03:14 +00:00
matches!(self, Value::Boolean(_))
2023-08-22 15:40:50 +00:00
}
pub fn is_list(&self) -> bool {
matches!(self, Value::List(_))
}
pub fn is_empty(&self) -> bool {
2023-10-05 12:03:14 +00:00
matches!(self, Value::Empty)
2023-08-22 15:40:50 +00:00
}
pub fn is_map(&self) -> bool {
matches!(self, Value::Map(_))
}
pub fn is_function(&self) -> bool {
matches!(self, Value::Map(_))
}
2023-10-05 12:03:14 +00:00
/// Borrows the value stored in `self` as `String`, or returns `Err` if `self` is not a `Value::String`.
2023-08-22 15:40:50 +00:00
pub fn as_string(&self) -> Result<&String> {
match self {
2023-10-05 12:03:14 +00:00
Value::String(string) => Ok(string),
2023-08-22 15:40:50 +00:00
value => Err(Error::expected_string(value.clone())),
}
}
/// Copies the value stored in `self` as `i64`, or returns `Err` if `self` is not a `Value::Int`.
pub fn as_int(&self) -> Result<i64> {
match self {
2023-10-05 12:03:14 +00:00
Value::Integer(i) => Ok(*i),
2023-08-22 15:40:50 +00:00
value => Err(Error::expected_int(value.clone())),
}
}
2023-10-02 21:15:05 +00:00
/// Copies the value stored in `self` as `f64`, or returns `Err` if `self` is not a `Primitive::Float`.
2023-08-22 15:40:50 +00:00
pub fn as_float(&self) -> Result<f64> {
match self {
2023-10-05 12:03:14 +00:00
Value::Float(f) => Ok(*f),
2023-08-22 15:40:50 +00:00
value => Err(Error::expected_float(value.clone())),
}
}
2023-10-02 21:15:05 +00:00
/// Copies the value stored in `self` as `f64`, or returns `Err` if `self` is not a `Primitive::Float` or `Value::Int`.
2023-08-22 15:40:50 +00:00
/// Note that this method silently converts `i64` to `f64`, if `self` is a `Value::Int`.
pub fn as_number(&self) -> Result<f64> {
match self {
2023-10-05 12:03:14 +00:00
Value::Float(f) => Ok(*f),
Value::Integer(i) => Ok(*i as f64),
2023-08-22 15:40:50 +00:00
value => Err(Error::expected_number(value.clone())),
}
}
2023-10-02 21:15:05 +00:00
/// Copies the value stored in `self` as `bool`, or returns `Err` if `self` is not a `Primitive::Boolean`.
2023-08-22 15:40:50 +00:00
pub fn as_boolean(&self) -> Result<bool> {
match self {
2023-10-05 12:03:14 +00:00
Value::Boolean(boolean) => Ok(*boolean),
2023-08-22 15:40:50 +00:00
value => Err(Error::expected_boolean(value.clone())),
}
}
/// Borrows the value stored in `self` as `Vec<Value>`, or returns `Err` if `self` is not a `Value::List`.
pub fn as_list(&self) -> Result<&Vec<Value>> {
match self {
Value::List(list) => Ok(list),
value => Err(Error::expected_list(value.clone())),
}
}
/// Borrows the value stored in `self` as `Vec<Value>`, or returns `Err` if `self` is not a `Value::List`.
pub fn into_inner_list(self) -> Result<Vec<Value>> {
match self {
Value::List(list) => Ok(list),
value => Err(Error::expected_list(value.clone())),
}
}
/// Borrows the value stored in `self` as `Vec<Value>` or returns `Err` if `self` is not a `Value::Map` of the required length.
pub fn as_fixed_len_list(&self, len: usize) -> Result<&Vec<Value>> {
match self {
Value::List(tuple) => {
if tuple.len() == len {
Ok(tuple)
} else {
Err(Error::expected_fixed_len_list(len, self.clone()))
}
}
value => Err(Error::expected_list(value.clone())),
}
}
/// Borrows the value stored in `self` as `Vec<Value>`, or returns `Err` if `self` is not a `Value::Map`.
pub fn as_map(&self) -> Result<&VariableMap> {
match self {
Value::Map(map) => Ok(map),
value => Err(Error::expected_map(value.clone())),
}
}
/// Borrows the value stored in `self` as `Vec<Value>`, or returns `Err` if `self` is not a `Value::Table`.
pub fn as_table(&self) -> Result<&Table> {
match self {
Value::Table(table) => Ok(table),
value => Err(Error::expected_table(value.clone())),
}
}
/// Borrows the value stored in `self` as `Function`, or returns `Err` if
/// `self` is not a `Value::Function`.
pub fn as_function(&self) -> Result<&Function> {
match self {
Value::Function(function) => Ok(function),
value => Err(Error::expected_function(value.clone())),
}
}
/// Returns `()`, or returns`Err` if `self` is not a `Value::Tuple`.
pub fn as_empty(&self) -> Result<()> {
match self {
2023-10-05 12:03:14 +00:00
Value::Empty => Ok(()),
2023-08-22 15:40:50 +00:00
value => Err(Error::expected_empty(value.clone())),
}
}
/// Returns an owned table, either by cloning or converting the inner value..
pub fn to_table(&self) -> Result<Table> {
match self {
Value::Table(table) => Ok(table.clone()),
Value::List(list) => Ok(Table::from(list)),
Value::Map(map) => Ok(Table::from(map)),
value => Err(Error::expected_table(value.clone())),
}
}
}
2023-09-29 03:53:37 +00:00
impl Add for Value {
type Output = Result<Value>;
2023-09-29 10:02:46 +00:00
fn add(self, other: Self) -> Self::Output {
2023-10-09 19:54:47 +00:00
let non_number = match (self, other) {
(Value::Integer(left), Value::Integer(right)) => {
return Ok(Value::Integer(left + right))
2023-09-29 03:53:37 +00:00
}
2023-10-09 19:54:47 +00:00
(Value::Float(left), Value::Float(right)) => return Ok(Value::Float(left + right)),
(Value::Integer(left), Value::Float(right)) => {
return Ok(Value::Float(left as f64 + right))
2023-09-29 03:53:37 +00:00
}
2023-10-09 19:54:47 +00:00
(Value::Float(left), Value::Integer(right)) => {
return Ok(Value::Float(left + right as f64))
2023-09-29 03:53:37 +00:00
}
2023-10-09 19:54:47 +00:00
(non_number, Value::Integer(_)) | (non_number, Value::Float(_)) => non_number,
(non_number, _) => non_number,
};
Err(Error::ExpectedNumber { actual: non_number })
}
}
impl Sub for Value {
type Output = Result<Self>;
fn sub(self, other: Self) -> Self::Output {
let non_number = match (self, other) {
(Value::Integer(left), Value::Integer(right)) => {
return Ok(Value::Integer(left + right))
2023-09-29 03:53:37 +00:00
}
2023-10-09 19:54:47 +00:00
(Value::Float(left), Value::Float(right)) => return Ok(Value::Float(left + right)),
(Value::Integer(left), Value::Float(right)) => {
return Ok(Value::Float(left as f64 + right))
2023-09-29 03:53:37 +00:00
}
2023-10-09 19:54:47 +00:00
(Value::Float(left), Value::Integer(right)) => {
return Ok(Value::Float(left + right as f64))
2023-09-29 03:53:37 +00:00
}
2023-10-09 19:54:47 +00:00
(non_number, Value::Integer(_)) | (non_number, Value::Float(_)) => non_number,
(non_number, _) => non_number,
};
Err(Error::ExpectedNumber { actual: non_number })
2023-09-29 03:53:37 +00:00
}
}
2023-10-09 19:54:47 +00:00
impl AddAssign for Value {
fn add_assign(&mut self, other: Self) {
match (self, other) {
(Value::Integer(left), Value::Integer(right)) => *left += right,
(Value::Float(left), Value::Float(right)) => *left += right,
(Value::Float(left), Value::Integer(right)) => *left += right as f64,
_ => {}
}
}
}
2023-09-29 10:02:46 +00:00
2023-10-09 19:54:47 +00:00
impl SubAssign for Value {
fn sub_assign(&mut self, other: Self) {
match (self, other) {
(Value::Integer(left), Value::Integer(right)) => *left -= right,
(Value::Float(left), Value::Float(right)) => *left -= right,
(Value::Float(left), Value::Integer(right)) => *left -= right as f64,
_ => {}
}
2023-09-29 10:02:46 +00:00
}
}
2023-08-22 15:40:50 +00:00
impl Eq for Value {}
2023-10-01 16:17:27 +00:00
impl PartialEq for Value {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
2023-10-05 12:42:23 +00:00
(Value::Integer(left), Value::Integer(right)) => left == right,
(Value::Float(left), Value::Float(right)) => left == right,
(Value::Boolean(left), Value::Boolean(right)) => left == right,
(Value::String(left), Value::String(right)) => left == right,
2023-10-01 16:17:27 +00:00
(Value::List(left), Value::List(right)) => left == right,
(Value::Map(left), Value::Map(right)) => left == right,
(Value::Table(left), Value::Table(right)) => left == right,
(Value::Function(left), Value::Function(right)) => left == right,
2023-10-05 12:42:23 +00:00
(Value::Empty, Value::Empty) => true,
2023-10-01 16:17:27 +00:00
_ => false,
}
}
}
2023-08-22 15:40:50 +00:00
impl PartialOrd for Value {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Value {
fn cmp(&self, other: &Self) -> Ordering {
match (self, other) {
2023-10-05 12:03:14 +00:00
(Value::String(left), Value::String(right)) => left.cmp(right),
(Value::String(_), _) => Ordering::Greater,
(Value::Float(left), Value::Float(right)) => left.total_cmp(right),
(Value::Float(_), _) => Ordering::Greater,
(Value::Integer(left), Value::Integer(right)) => left.cmp(right),
(Value::Integer(_), _) => Ordering::Greater,
(Value::Boolean(left), Value::Boolean(right)) => left.cmp(right),
(Value::Boolean(_), _) => Ordering::Greater,
2023-08-22 15:40:50 +00:00
(Value::List(left), Value::List(right)) => left.cmp(right),
(Value::List(_), _) => Ordering::Greater,
(Value::Map(left), Value::Map(right)) => left.cmp(right),
(Value::Map(_), _) => Ordering::Greater,
(Value::Table(left), Value::Table(right)) => left.cmp(right),
(Value::Table(_), _) => Ordering::Greater,
(Value::Function(left), Value::Function(right)) => left.cmp(right),
(Value::Function(_), _) => Ordering::Greater,
2023-10-05 12:42:23 +00:00
(Value::Empty, Value::Empty) => Ordering::Equal,
2023-10-05 12:03:14 +00:00
(Value::Empty, _) => Ordering::Less,
2023-08-22 15:40:50 +00:00
}
}
}
impl Serialize for Value {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
{
match self {
2023-10-05 12:03:14 +00:00
Value::String(inner) => serializer.serialize_str(inner),
Value::Float(inner) => serializer.serialize_f64(*inner),
Value::Integer(inner) => serializer.serialize_i64(*inner),
Value::Boolean(inner) => serializer.serialize_bool(*inner),
2023-08-22 15:40:50 +00:00
Value::List(inner) => {
let mut tuple = serializer.serialize_tuple(inner.len())?;
for value in inner {
tuple.serialize_element(value)?;
}
tuple.end()
}
2023-10-05 12:03:14 +00:00
Value::Empty => todo!(),
2023-08-22 15:40:50 +00:00
Value::Map(inner) => inner.serialize(serializer),
Value::Table(inner) => inner.serialize(serializer),
Value::Function(inner) => inner.serialize(serializer),
}
}
}
impl Display for Value {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match self {
2023-10-05 12:03:14 +00:00
Value::String(string) => write!(f, "{string}"),
Value::Float(float) => write!(f, "{}", float),
Value::Integer(int) => write!(f, "{}", int),
Value::Boolean(boolean) => write!(f, "{}", boolean),
Value::Empty => write!(f, "()"),
2023-10-03 03:19:01 +00:00
Value::List(list) => {
2023-10-05 12:20:20 +00:00
write!(f, "[")?;
2023-10-03 03:19:01 +00:00
for value in list {
write!(f, " {value} ")?;
}
2023-10-05 12:20:20 +00:00
write!(f, "]")
2023-10-03 03:19:01 +00:00
}
2023-08-22 15:40:50 +00:00
Value::Map(map) => write!(f, "{map}"),
Value::Table(table) => write!(f, "{table}"),
Value::Function(function) => write!(f, "{function}"),
}
}
}
impl From<String> for Value {
fn from(string: String) -> Self {
2023-10-05 12:03:14 +00:00
Value::String(string)
2023-08-22 15:40:50 +00:00
}
}
impl From<&str> for Value {
fn from(string: &str) -> Self {
2023-10-05 12:03:14 +00:00
Value::String(string.to_string())
2023-08-22 15:40:50 +00:00
}
}
impl From<f64> for Value {
fn from(float: f64) -> Self {
2023-10-05 12:03:14 +00:00
Value::Float(float)
2023-08-22 15:40:50 +00:00
}
}
impl From<i64> for Value {
fn from(int: i64) -> Self {
2023-10-05 12:03:14 +00:00
Value::Integer(int)
2023-08-22 15:40:50 +00:00
}
}
impl From<bool> for Value {
fn from(boolean: bool) -> Self {
2023-10-05 12:03:14 +00:00
Value::Boolean(boolean)
2023-08-22 15:40:50 +00:00
}
}
impl From<Vec<Value>> for Value {
fn from(tuple: Vec<Value>) -> Self {
Value::List(tuple)
}
}
impl From<Value> for Result<Value> {
fn from(value: Value) -> Self {
Ok(value)
}
}
impl From<()> for Value {
fn from(_: ()) -> Self {
2023-10-05 12:03:14 +00:00
Value::Empty
2023-08-22 15:40:50 +00:00
}
}
impl TryFrom<JsonValue> for Value {
type Error = Error;
fn try_from(json_value: JsonValue) -> Result<Self> {
use JsonValue::*;
match json_value {
2023-10-05 12:03:14 +00:00
Null => Ok(Value::Empty),
Short(short) => Ok(Value::String(short.to_string())),
String(string) => Ok(Value::String(string)),
Number(number) => Ok(Value::Float(f64::from(number))),
Boolean(boolean) => Ok(Value::Boolean(boolean)),
2023-08-22 15:40:50 +00:00
Object(object) => {
let mut map = VariableMap::new();
for (key, node_value) in object.iter() {
let value = Value::try_from(node_value)?;
2023-10-02 19:19:48 +00:00
map.set_value(key.to_string(), value)?;
2023-08-22 15:40:50 +00:00
}
Ok(Value::Map(map))
}
Array(array) => {
let mut list = Vec::new();
for json_value in array {
let value = Value::try_from(json_value)?;
list.push(value);
}
Ok(Value::List(list))
}
}
}
}
impl TryFrom<&JsonValue> for Value {
type Error = Error;
fn try_from(json_value: &JsonValue) -> Result<Self> {
use JsonValue::*;
match json_value {
2023-10-05 12:03:14 +00:00
Null => Ok(Value::Empty),
Short(short) => Ok(Value::String(short.to_string())),
String(string) => Ok(Value::String(string.clone())),
Number(number) => Ok(Value::Float(f64::from(*number))),
Boolean(boolean) => Ok(Value::Boolean(*boolean)),
2023-08-22 15:40:50 +00:00
Object(object) => {
let mut map = VariableMap::new();
for (key, node_value) in object.iter() {
let value = Value::try_from(node_value)?;
2023-10-02 19:19:48 +00:00
map.set_value(key.to_string(), value)?;
2023-08-22 15:40:50 +00:00
}
Ok(Value::Map(map))
}
Array(array) => {
let mut list = Vec::new();
for json_value in array {
let value = Value::try_from(json_value)?;
list.push(value);
}
Ok(Value::List(list))
}
}
}
}
impl TryFrom<Value> for String {
type Error = Error;
fn try_from(value: Value) -> std::result::Result<Self, Self::Error> {
2023-10-05 12:03:14 +00:00
if let Value::String(value) = value {
2023-08-22 15:40:50 +00:00
Ok(value)
} else {
Err(Error::ExpectedString { actual: value })
}
}
}
impl TryFrom<Value> for f64 {
type Error = Error;
fn try_from(value: Value) -> std::result::Result<Self, Self::Error> {
2023-10-05 12:03:14 +00:00
if let Value::Float(value) = value {
2023-08-22 15:40:50 +00:00
Ok(value)
} else {
Err(Error::ExpectedFloat { actual: value })
}
}
}
impl TryFrom<Value> for i64 {
type Error = Error;
fn try_from(value: Value) -> std::result::Result<Self, Self::Error> {
2023-10-05 12:03:14 +00:00
if let Value::Integer(value) = value {
2023-08-22 15:40:50 +00:00
Ok(value)
} else {
Err(Error::ExpectedInt { actual: value })
}
}
}
impl TryFrom<Value> for bool {
type Error = Error;
fn try_from(value: Value) -> std::result::Result<Self, Self::Error> {
2023-10-05 12:03:14 +00:00
if let Value::Boolean(value) = value {
2023-08-22 15:40:50 +00:00
Ok(value)
} else {
Err(Error::ExpectedBoolean { actual: value })
}
}
}
struct ValueVisitor {
marker: PhantomData<fn() -> Value>,
}
impl ValueVisitor {
fn new() -> Self {
ValueVisitor {
marker: PhantomData,
}
}
}
impl<'de> Visitor<'de> for ValueVisitor {
type Value = Value;
fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
formatter.write_str("Any valid whale data.")
}
fn visit_bool<E>(self, v: bool) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
2023-10-05 12:03:14 +00:00
Ok(Value::Boolean(v))
2023-08-22 15:40:50 +00:00
}
fn visit_i8<E>(self, v: i8) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_i64(v as i64)
}
fn visit_i16<E>(self, v: i16) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_i64(v as i64)
}
fn visit_i32<E>(self, v: i32) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_i64(v as i64)
}
fn visit_i64<E>(self, v: i64) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
2023-10-05 12:03:14 +00:00
Ok(Value::Integer(v))
2023-08-22 15:40:50 +00:00
}
fn visit_i128<E>(self, v: i128) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
if v > i64::MAX as i128 {
2023-10-05 12:03:14 +00:00
Ok(Value::Integer(i64::MAX))
2023-08-22 15:40:50 +00:00
} else {
2023-10-05 12:03:14 +00:00
Ok(Value::Integer(v as i64))
2023-08-22 15:40:50 +00:00
}
}
fn visit_u8<E>(self, v: u8) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_u64(v as u64)
}
fn visit_u16<E>(self, v: u16) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_u64(v as u64)
}
fn visit_u32<E>(self, v: u32) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_u64(v as u64)
}
fn visit_u64<E>(self, v: u64) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_i64(v as i64)
}
fn visit_u128<E>(self, v: u128) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_i128(v as i128)
}
fn visit_f32<E>(self, v: f32) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_f64(v as f64)
}
fn visit_f64<E>(self, v: f64) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
2023-10-05 12:03:14 +00:00
Ok(Value::Float(v))
2023-08-22 15:40:50 +00:00
}
fn visit_char<E>(self, v: char) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_str(&v.to_string())
}
fn visit_str<E>(self, v: &str) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
2023-10-05 12:03:14 +00:00
Ok(Value::String(v.to_string()))
2023-08-22 15:40:50 +00:00
}
fn visit_borrowed_str<E>(self, v: &'de str) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_str(v)
}
fn visit_string<E>(self, v: String) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
2023-10-05 12:03:14 +00:00
Ok(Value::String(v))
2023-08-22 15:40:50 +00:00
}
fn visit_bytes<E>(self, v: &[u8]) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
let _ = v;
Err(serde::de::Error::invalid_type(
serde::de::Unexpected::Bytes(v),
&self,
))
}
fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_bytes(v)
}
fn visit_byte_buf<E>(self, v: Vec<u8>) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
self.visit_bytes(&v)
}
fn visit_none<E>(self) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
Err(serde::de::Error::invalid_type(
serde::de::Unexpected::Option,
&self,
))
}
fn visit_some<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
where
D: serde::Deserializer<'de>,
{
let _ = deserializer;
Err(serde::de::Error::invalid_type(
serde::de::Unexpected::Option,
&self,
))
}
fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
Err(serde::de::Error::invalid_type(
serde::de::Unexpected::Unit,
&self,
))
}
fn visit_newtype_struct<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
where
D: serde::Deserializer<'de>,
{
let _ = deserializer;
Err(serde::de::Error::invalid_type(
serde::de::Unexpected::NewtypeStruct,
&self,
))
}
fn visit_seq<A>(self, mut access: A) -> std::result::Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut list = Vec::new();
while let Some(value) = access.next_element()? {
list.push(value);
}
Ok(Value::List(list))
}
fn visit_map<M>(self, mut access: M) -> std::result::Result<Value, M::Error>
where
M: MapAccess<'de>,
{
let mut map = VariableMap::new();
while let Some((key, value)) = access.next_entry()? {
map.set_value(key, value)
.expect("Failed to deserialize Value. This is a no-op.");
}
Ok(Value::Map(map))
}
fn visit_enum<A>(self, data: A) -> std::result::Result<Self::Value, A::Error>
where
A: serde::de::EnumAccess<'de>,
{
let _ = data;
Err(serde::de::Error::invalid_type(
serde::de::Unexpected::Enum,
&self,
))
}
fn __private_visit_untagged_option<D>(self, _: D) -> std::result::Result<Self::Value, ()>
where
D: serde::Deserializer<'de>,
{
Err(())
}
}
impl<'de> Deserialize<'de> for Value {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
deserializer.deserialize_any(ValueVisitor::new())
}
}