git.delta.rocks / jrsonnet / refs/commits / 0d4913596ab0

difftreelog

source

crates/jrsonnet-stdlib/src/expr.rs2.8 KiBsourcehistory
1use jrsonnet_parser::LocExpr;23pub fn stdlib_expr() -> LocExpr {4	#[cfg(feature = "serialized-stdlib")]5	{6		use bincode::{BincodeRead, DefaultOptions, Options};7		use serde::{Deserialize, Deserializer};89		struct LocDeserializer<R, O: Options> {10			source: Source,11			wrapped: bincode::Deserializer<R, O>,12		}13		macro_rules! delegate {14			($(fn $name:ident($($arg:ident: $ty:ty),*))+) => {$(15				fn $name<V>(mut self $(, $arg: $ty)*, visitor: V) -> Result<V::Value, Self::Error>16				where V: serde::de::Visitor<'de>,17				{18					self.wrapped.$name($($arg,)* visitor)19				}20			)+};21		}22		impl<'de, R, O> Deserializer<'de> for LocDeserializer<R, O>23		where24			R: BincodeRead<'de>,25			O: Options,26		{27			type Error = <&'de mut bincode::Deserializer<R, O> as Deserializer<'de>>::Error;2829			delegate! {30				fn deserialize_any()31				fn deserialize_bool()32				fn deserialize_u16()33				fn deserialize_u32()34				fn deserialize_u64()35				fn deserialize_i16()36				fn deserialize_i32()37				fn deserialize_i64()38				fn deserialize_f32()39				fn deserialize_f64()40				fn deserialize_u128()41				fn deserialize_i128()42				fn deserialize_u8()43				fn deserialize_i8()44				fn deserialize_unit()45				fn deserialize_char()46				fn deserialize_str()47				fn deserialize_string()48				fn deserialize_bytes()49				fn deserialize_byte_buf()50				fn deserialize_enum(name: &'static str, variants: &'static [&'static str])51				fn deserialize_tuple(len: usize)52				fn deserialize_option()53				fn deserialize_seq()54				fn deserialize_map()55				fn deserialize_struct(name: &'static str, fields: &'static [&'static str])56				fn deserialize_identifier()57				fn deserialize_newtype_struct(name: &'static str)58				fn deserialize_unit_struct(name: &'static str)59				fn deserialize_tuple_struct(name: &'static str, len: usize)60				fn deserialize_ignored_any()61			}6263			fn is_human_readable(&self) -> bool {64				false65			}66		}6768		// In build.rs, Source object is populated with empty values, deserializer wrapper loads correct values on deserialize69		let mut deserializer = bincode::Deserializer::from_slice(70			include_bytes!(concat!(env!("OUT_DIR"), "/stdlib.bincode")),71			DefaultOptions::new()72				.with_fixint_encoding()73				.allow_trailing_bytes(),74		);7576		// Should not panic, stdlib.bincode is generated in build.rs77		LocExpr::deserialize(&mut deserializer).unwrap()78	}7980	#[cfg(feature = "codegenerated-stdlib")]81	{82		mod structdump_import {83			pub(super) use std::{option::Option, rc::Rc, vec};8485			pub(super) use jrsonnet_parser::*;86		}8788		include!(concat!(env!("OUT_DIR"), "/stdlib.rs"))89	}9091	#[cfg(not(feature = "codegenerated-stdlib"))]92	{93		use jrsonnet_parser::Source;9495		const STDLIB_STR: &str = include_str!("./std.jsonnet");9697		jrsonnet_parser::parse(98			STDLIB_STR,99			&jrsonnet_parser::ParserSettings {100				source: Source::new_virtual("<std>".into(), STDLIB_STR.into()),101			},102		)103		.unwrap()104	}105}