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

difftreelog

refactor(evaluator) extract json to module

Lach2020-08-15parent: #219ced5.patch.diff
in: master

4 files changed

addedcrates/jrsonnet-evaluator/src/builtin/manifest.rsdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-evaluator/src/builtin/manifest.rs
@@ -0,0 +1,150 @@
+use crate::error::Error::*;
+use crate::error::Result;
+use crate::{throw, Val};
+
+#[derive(PartialEq)]
+pub enum ManifestType {
+	// Applied in manifestification
+	Manifest,
+	/// Used for std.manifestJson
+	/// Empty array/objects extends to "[\n\n]" instead of "[ ]" as in manifest
+	Std,
+	// No line breaks, used in `obj+''`
+	ToString,
+}
+
+pub struct ManifestJsonOptions<'s> {
+	pub padding: &'s str,
+	pub mtype: ManifestType,
+}
+
+pub(crate) fn manifest_json_ex(val: &Val, options: &ManifestJsonOptions<'_>) -> Result<String> {
+	let mut out = String::new();
+	manifest_json_ex_buf(val, &mut out, &mut String::new(), options)?;
+	Ok(out)
+}
+fn manifest_json_ex_buf(
+	val: &Val,
+	buf: &mut String,
+	cur_padding: &mut String,
+	options: &ManifestJsonOptions<'_>,
+) -> Result<()> {
+	use std::fmt::Write;
+	match val.unwrap_if_lazy()? {
+		Val::Bool(v) => {
+			if v {
+				buf.push_str("true");
+			} else {
+				buf.push_str("false");
+			}
+		}
+		Val::Null => buf.push_str("null"),
+		Val::Str(s) => buf.push_str(&escape_string_json(&s)),
+		Val::Num(n) => write!(buf, "{}", n).unwrap(),
+		Val::Arr(items) => {
+			buf.push('[');
+			if !items.is_empty() {
+				if options.mtype != ManifestType::ToString {
+					buf.push('\n');
+				}
+
+				let old_len = cur_padding.len();
+				cur_padding.push_str(options.padding);
+				for (i, item) in items.iter().enumerate() {
+					if i != 0 {
+						buf.push(',');
+						if options.mtype == ManifestType::ToString {
+							buf.push(' ');
+						} else {
+							buf.push('\n');
+						}
+					}
+					buf.push_str(cur_padding);
+					manifest_json_ex_buf(item, buf, cur_padding, options)?;
+				}
+				cur_padding.truncate(old_len);
+
+				if options.mtype != ManifestType::ToString {
+					buf.push('\n');
+					buf.push_str(cur_padding);
+				}
+			} else if options.mtype == ManifestType::Std {
+				buf.push_str("\n\n");
+				buf.push_str(cur_padding);
+			} else if options.mtype == ManifestType::ToString {
+				buf.push(' ');
+			}
+			buf.push(']');
+		}
+		Val::Obj(obj) => {
+			buf.push('{');
+			let fields = obj.visible_fields();
+			if !fields.is_empty() {
+				if options.mtype != ManifestType::ToString {
+					buf.push('\n');
+				}
+
+				let old_len = cur_padding.len();
+				cur_padding.push_str(options.padding);
+				for (i, field) in fields.into_iter().enumerate() {
+					if i != 0 {
+						buf.push(',');
+						if options.mtype == ManifestType::ToString {
+							buf.push(' ');
+						} else {
+							buf.push('\n');
+						}
+					}
+					buf.push_str(cur_padding);
+					buf.push_str(&escape_string_json(&field));
+					buf.push_str(": ");
+					manifest_json_ex_buf(&obj.get(field)?.unwrap(), buf, cur_padding, options)?;
+				}
+				cur_padding.truncate(old_len);
+
+				if options.mtype != ManifestType::ToString {
+					buf.push('\n');
+					buf.push_str(cur_padding);
+				}
+			} else if options.mtype == ManifestType::Std {
+				buf.push_str("\n\n");
+				buf.push_str(cur_padding);
+			} else if options.mtype == ManifestType::ToString {
+				buf.push(' ');
+			}
+			buf.push('}');
+		}
+		Val::Func(_) | Val::Intristic(_, _) => {
+			throw!(RuntimeError("tried to manifest function".into()))
+		}
+		Val::Lazy(_) => unreachable!(),
+	};
+	Ok(())
+}
+pub fn escape_string_json(s: &str) -> String {
+	use std::fmt::Write;
+	let mut out = String::new();
+	out.push('"');
+	for c in s.chars() {
+		match c {
+			'"' => out.push_str("\\\""),
+			'\\' => out.push_str("\\\\"),
+			'\u{0008}' => out.push_str("\\b"),
+			'\u{000c}' => out.push_str("\\f"),
+			'\n' => out.push_str("\\n"),
+			'\r' => out.push_str("\\r"),
+			'\t' => out.push_str("\\t"),
+			c if c < 32 as char || (c >= 127 as char && c <= 159 as char) => {
+				write!(out, "\\u{:04x}", c as u32).unwrap()
+			}
+			c => out.push(c),
+		}
+	}
+	out.push('"');
+	out
+}
+
+#[test]
+fn json_test() {
+	assert_eq!(escape_string_json("\u{001f}"), "\"\\u001f\"")
+}
modifiedcrates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth
2pub use stdlib::*;2pub use stdlib::*;
33
4pub mod format;4pub mod format;
5pub mod manifest;
56
modifiedcrates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate.rs
@@ -1,12 +1,13 @@
 use crate::{
-	builtin::format::{format_arr, format_obj},
+	builtin::{
+		format::{format_arr, format_obj},
+		manifest::{escape_string_json, manifest_json_ex, ManifestJsonOptions, ManifestType},
+	},
 	context_creator, equals,
 	error::Error::*,
-	escape_string_json, future_wrapper, lazy_val, manifest_json_ex, parse_args, primitive_equals,
-	push, throw,
-	val::ManifestJsonOptions,
-	with_state, Context, ContextCreator, FuncDesc, LazyBinding, LazyVal, LocError, ManifestType,
-	ObjMember, ObjValue, Result, Val, ValType,
+	future_wrapper, lazy_val, parse_args, primitive_equals, push, throw, with_state, Context,
+	ContextCreator, FuncDesc, LazyBinding, LazyVal, LocError, ObjMember, ObjValue, Result, Val,
+	ValType,
 };
 use closure::closure;
 use jrsonnet_parser::{
modifiedcrates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/val.rs
+++ b/crates/jrsonnet-evaluator/src/val.rs
@@ -1,4 +1,5 @@
 use crate::{
+	builtin::manifest::{manifest_json_ex, ManifestJsonOptions, ManifestType},
 	error::Error::*,
 	evaluate,
 	function::{parse_function_call, parse_function_call_map, place_args},
@@ -351,152 +352,5 @@
 			Ok(true)
 		}
 		(a, b) => Ok(primitive_equals(&a, &b)?),
-	}
-}
-
-#[derive(PartialEq)]
-pub enum ManifestType {
-	// Applied in manifestification
-	Manifest,
-	/// Used for std.manifestJson
-	/// Empty array/objects extends to "[\n\n]" instead of "[ ]" as in manifest
-	Std,
-	// No line breaks, used in `obj+''`
-	ToString,
-}
-
-pub struct ManifestJsonOptions<'s> {
-	pub padding: &'s str,
-	pub mtype: ManifestType,
-}
-
-pub fn manifest_json_ex(val: &Val, options: &ManifestJsonOptions<'_>) -> Result<String> {
-	let mut out = String::new();
-	manifest_json_ex_buf(val, &mut out, &mut String::new(), options)?;
-	Ok(out)
-}
-fn manifest_json_ex_buf(
-	val: &Val,
-	buf: &mut String,
-	cur_padding: &mut String,
-	options: &ManifestJsonOptions<'_>,
-) -> Result<()> {
-	use std::fmt::Write;
-	match val.unwrap_if_lazy()? {
-		Val::Bool(v) => {
-			if v {
-				buf.push_str("true");
-			} else {
-				buf.push_str("false");
-			}
-		}
-		Val::Null => buf.push_str("null"),
-		Val::Str(s) => buf.push_str(&escape_string_json(&s)),
-		Val::Num(n) => write!(buf, "{}", n).unwrap(),
-		Val::Arr(items) => {
-			buf.push('[');
-			if !items.is_empty() {
-				if options.mtype != ManifestType::ToString {
-					buf.push('\n');
-				}
-
-				let old_len = cur_padding.len();
-				cur_padding.push_str(options.padding);
-				for (i, item) in items.iter().enumerate() {
-					if i != 0 {
-						buf.push(',');
-						if options.mtype == ManifestType::ToString {
-							buf.push(' ');
-						} else {
-							buf.push('\n');
-						}
-					}
-					buf.push_str(cur_padding);
-					manifest_json_ex_buf(item, buf, cur_padding, options)?;
-				}
-				cur_padding.truncate(old_len);
-
-				if options.mtype != ManifestType::ToString {
-					buf.push('\n');
-					buf.push_str(cur_padding);
-				}
-			} else if options.mtype == ManifestType::Std {
-				buf.push_str("\n\n");
-				buf.push_str(cur_padding);
-			} else if options.mtype == ManifestType::ToString {
-				buf.push(' ');
-			}
-			buf.push(']');
-		}
-		Val::Obj(obj) => {
-			buf.push('{');
-			let fields = obj.visible_fields();
-			if !fields.is_empty() {
-				if options.mtype != ManifestType::ToString {
-					buf.push('\n');
-				}
-
-				let old_len = cur_padding.len();
-				cur_padding.push_str(options.padding);
-				for (i, field) in fields.into_iter().enumerate() {
-					if i != 0 {
-						buf.push(',');
-						if options.mtype == ManifestType::ToString {
-							buf.push(' ');
-						} else {
-							buf.push('\n');
-						}
-					}
-					buf.push_str(cur_padding);
-					buf.push_str(&escape_string_json(&field));
-					buf.push_str(": ");
-					manifest_json_ex_buf(&obj.get(field)?.unwrap(), buf, cur_padding, options)?;
-				}
-				cur_padding.truncate(old_len);
-
-				if options.mtype != ManifestType::ToString {
-					buf.push('\n');
-					buf.push_str(cur_padding);
-				}
-			} else if options.mtype == ManifestType::Std {
-				buf.push_str("\n\n");
-				buf.push_str(cur_padding);
-			} else if options.mtype == ManifestType::ToString {
-				buf.push(' ');
-			}
-			buf.push('}');
-		}
-		Val::Func(_) | Val::Intristic(_, _) => {
-			throw!(RuntimeError("tried to manifest function".into()))
-		}
-		Val::Lazy(_) => unreachable!(),
-	};
-	Ok(())
-}
-pub fn escape_string_json(s: &str) -> String {
-	use std::fmt::Write;
-	let mut out = String::new();
-	out.push('"');
-	for c in s.chars() {
-		match c {
-			'"' => out.push_str("\\\""),
-			'\\' => out.push_str("\\\\"),
-			'\u{0008}' => out.push_str("\\b"),
-			'\u{000c}' => out.push_str("\\f"),
-			'\n' => out.push_str("\\n"),
-			'\r' => out.push_str("\\r"),
-			'\t' => out.push_str("\\t"),
-			c if c < 32 as char || (c >= 127 as char && c <= 159 as char) => {
-				write!(out, "\\u{:04x}", c as u32).unwrap()
-			}
-			c => out.push(c),
-		}
 	}
-	out.push('"');
-	out
-}
-
-#[test]
-fn json_test() {
-	assert_eq!(escape_string_json("\u{001f}"), "\"\\u001f\"")
 }