git.delta.rocks / jrsonnet / refs/commits / 58e35be8e6f4

difftreelog

fix build without codegenerated-stdlib feature

Yaroslav Bolyukin2023-04-08parent: #759cfac.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-stdlib/build.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/build.rs
+++ b/crates/jrsonnet-stdlib/build.rs
@@ -1,30 +1,34 @@
-use std::{env, fs::File, io::Write, path::Path};
+fn main() {
+	#[cfg(feature = "codegenerated-stdlib")]
+	{
+		use std::{env, fs::File, io::Write, path::Path};
 
-use jrsonnet_parser::{parse, ParserSettings, Source};
-use structdump::CodegenResult;
+		use jrsonnet_parser::{parse, ParserSettings, Source};
+		use structdump::CodegenResult;
 
-fn main() {
-	let parsed = parse(
-		include_str!("./src/std.jsonnet"),
-		&ParserSettings {
-			source: Source::new_virtual("<std>".into(), include_str!("./src/std.jsonnet").into()),
-		},
-	)
-	.expect("parse");
+		let parsed = parse(
+			include_str!("./src/std.jsonnet"),
+			&ParserSettings {
+				source: Source::new_virtual(
+					"<std>".into(),
+					include_str!("./src/std.jsonnet").into(),
+				),
+			},
+		)
+		.expect("parse");
 
-	let mut out = CodegenResult::default();
+		let mut out = CodegenResult::default();
 
-	let v = out.codegen(&parsed, true);
+		let v = out.codegen(&parsed, true);
 
-	{
-		let out_dir = env::var("OUT_DIR").unwrap();
-		let dest_path = Path::new(&out_dir).join("stdlib.rs");
-		let mut f = File::create(dest_path).unwrap();
-		f.write_all(
-			("#[allow(clippy::redundant_clone)]".to_owned() + &v.to_string())
-				.replace(';', ";\n")
-				.as_bytes(),
-		)
-		.unwrap();
+		{
+			let out_dir = env::var("OUT_DIR").unwrap();
+			let dest_path = Path::new(&out_dir).join("stdlib.rs");
+			let mut f = File::create(dest_path).unwrap();
+			f.write_all(
+				("#[allow(clippy::redundant_clone)]".to_owned() + &v.to_string()).as_bytes(),
+			)
+			.unwrap();
+		}
 	}
 }
modifiedcrates/jrsonnet-stdlib/src/expr.rsdiffbeforeafterboth
before · crates/jrsonnet-stdlib/src/expr.rs
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}