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

difftreelog

source

crates/jrsonnet-stdlib/src/expr.rs2.7 KiBsourcehistory
1use jrsonnet_parser::LocExpr;23mod structdump_import {4	pub(super) use std::{option::Option, rc::Rc, vec};56	pub(super) use jrsonnet_parser::*;7}89pub fn stdlib_expr() -> LocExpr {10	#[cfg(feature = "serialized-stdlib")]11	{12		use bincode::{BincodeRead, DefaultOptions, Options};13		use serde::{Deserialize, Deserializer};1415		struct LocDeserializer<R, O: Options> {16			source: Source,17			wrapped: bincode::Deserializer<R, O>,18		}19		macro_rules! delegate {20			($(fn $name:ident($($arg:ident: $ty:ty),*))+) => {$(21				fn $name<V>(mut self $(, $arg: $ty)*, visitor: V) -> Result<V::Value, Self::Error>22				where V: serde::de::Visitor<'de>,23				{24					self.wrapped.$name($($arg,)* visitor)25				}26			)+};27		}28		impl<'de, R, O> Deserializer<'de> for LocDeserializer<R, O>29		where30			R: BincodeRead<'de>,31			O: Options,32		{33			type Error = <&'de mut bincode::Deserializer<R, O> as Deserializer<'de>>::Error;3435			delegate! {36				fn deserialize_any()37				fn deserialize_bool()38				fn deserialize_u16()39				fn deserialize_u32()40				fn deserialize_u64()41				fn deserialize_i16()42				fn deserialize_i32()43				fn deserialize_i64()44				fn deserialize_f32()45				fn deserialize_f64()46				fn deserialize_u128()47				fn deserialize_i128()48				fn deserialize_u8()49				fn deserialize_i8()50				fn deserialize_unit()51				fn deserialize_char()52				fn deserialize_str()53				fn deserialize_string()54				fn deserialize_bytes()55				fn deserialize_byte_buf()56				fn deserialize_enum(name: &'static str, variants: &'static [&'static str])57				fn deserialize_tuple(len: usize)58				fn deserialize_option()59				fn deserialize_seq()60				fn deserialize_map()61				fn deserialize_struct(name: &'static str, fields: &'static [&'static str])62				fn deserialize_identifier()63				fn deserialize_newtype_struct(name: &'static str)64				fn deserialize_unit_struct(name: &'static str)65				fn deserialize_tuple_struct(name: &'static str, len: usize)66				fn deserialize_ignored_any()67			}6869			fn is_human_readable(&self) -> bool {70				false71			}72		}7374		// In build.rs, Source object is populated with empty values, deserializer wrapper loads correct values on deserialize75		let mut deserializer = bincode::Deserializer::from_slice(76			include_bytes!(concat!(env!("OUT_DIR"), "/stdlib.bincode")),77			DefaultOptions::new()78				.with_fixint_encoding()79				.allow_trailing_bytes(),80		);8182		// Should not panic, stdlib.bincode is generated in build.rs83		LocExpr::deserialize(&mut deserializer).unwrap()84	}8586	#[cfg(feature = "codegenerated-stdlib")]87	{88		include!(concat!(env!("OUT_DIR"), "/stdlib.rs"))89	}9091	#[cfg(not(feature = "codegenerated-stdlib"))]92	{93		jrsonnet_parser::parse(94			STDLIB_STR,95			&ParserSettings {96				file_name: Source::new_virtual(Cow::Borrowed("<std>"), STDLIB_STR.into()),97			},98		)99		.unwrap()100	}101}