git.delta.rocks / jrsonnet / refs/commits / aa97bc0e09e5

difftreelog

source

crates/jrsonnet-stdlib/src/expr.rs2.7 KiBsourcehistory
1use jrsonnet_parser::LocExpr;23mod structdump_import {4	pub(super) use std::{borrow::Cow, rc::Rc};56	pub(super) use jrsonnet_parser::*;7	pub(super) use vec;8	pub(super) use Option;9}1011pub fn stdlib_expr() -> LocExpr {12	#[cfg(feature = "serialized-stdlib")]13	{14		use bincode::{BincodeRead, DefaultOptions, Options};15		use serde::{Deserialize, Deserializer};1617		struct LocDeserializer<R, O: Options> {18			source: Source,19			wrapped: bincode::Deserializer<R, O>,20		}21		macro_rules! delegate {22			($(fn $name:ident($($arg:ident: $ty:ty),*))+) => {$(23				fn $name<V>(mut self $(, $arg: $ty)*, visitor: V) -> Result<V::Value, Self::Error>24				where V: serde::de::Visitor<'de>,25				{26					self.wrapped.$name($($arg,)* visitor)27				}28			)+};29		}30		impl<'de, R, O> Deserializer<'de> for LocDeserializer<R, O>31		where32			R: BincodeRead<'de>,33			O: Options,34		{35			type Error = <&'de mut bincode::Deserializer<R, O> as Deserializer<'de>>::Error;3637			delegate! {38				fn deserialize_any()39				fn deserialize_bool()40				fn deserialize_u16()41				fn deserialize_u32()42				fn deserialize_u64()43				fn deserialize_i16()44				fn deserialize_i32()45				fn deserialize_i64()46				fn deserialize_f32()47				fn deserialize_f64()48				fn deserialize_u128()49				fn deserialize_i128()50				fn deserialize_u8()51				fn deserialize_i8()52				fn deserialize_unit()53				fn deserialize_char()54				fn deserialize_str()55				fn deserialize_string()56				fn deserialize_bytes()57				fn deserialize_byte_buf()58				fn deserialize_enum(name: &'static str, variants: &'static [&'static str])59				fn deserialize_tuple(len: usize)60				fn deserialize_option()61				fn deserialize_seq()62				fn deserialize_map()63				fn deserialize_struct(name: &'static str, fields: &'static [&'static str])64				fn deserialize_identifier()65				fn deserialize_newtype_struct(name: &'static str)66				fn deserialize_unit_struct(name: &'static str)67				fn deserialize_tuple_struct(name: &'static str, len: usize)68				fn deserialize_ignored_any()69			}7071			fn is_human_readable(&self) -> bool {72				false73			}74		}7576		// In build.rs, Source object is populated with empty values, deserializer wrapper loads correct values on deserialize77		let mut deserializer = bincode::Deserializer::from_slice(78			include_bytes!(concat!(env!("OUT_DIR"), "/stdlib.bincode")),79			DefaultOptions::new()80				.with_fixint_encoding()81				.allow_trailing_bytes(),82		);8384		// Should not panic, stdlib.bincode is generated in build.rs85		LocExpr::deserialize(&mut deserializer).unwrap()86	}8788	#[cfg(feature = "codegenerated-stdlib")]89	{90		include!(concat!(env!("OUT_DIR"), "/stdlib.rs"))91	}9293	#[cfg(not(feature = "codegenerated-stdlib"))]94	{95		jrsonnet_parser::parse(96			STDLIB_STR,97			&ParserSettings {98				file_name: Source::new_virtual(Cow::Borrowed("<std>"), STDLIB_STR.into()),99			},100		)101		.unwrap()102	}103}