1use crate::prelude::*;
2use regex::Regex;
3use serde_json::{self, Map, Value as SerdeValue};
4
5pub enum JsonMode {
7 Indented,
9 Inline,
11}
12
13impl Value {
14 pub fn to_json_idented(&self) -> String {
15 self.to_json(JsonMode::Indented)
16 }
17
18 pub fn to_json_inline(&self) -> String {
19 self.to_json(JsonMode::Inline)
20 }
21
22 pub fn to_json(&self, mode: JsonMode) -> String {
23 match self.to_serde_json_value() {
24 Ok(serde_value) => match mode {
25 JsonMode::Inline => serde_value,
26 JsonMode::Indented => Self::idented(serde_value),
27 },
28 Err(e) => format!("Error converting to JSON: {}", e),
29 }
30 }
31
32 fn to_serde_json_value(&self) -> std::result::Result<String, serde_json::Error> {
34 serde_json::to_string(&self)
35 }
36
37 fn idented(value: String) -> String {
39 let v: Result<SerdeValue, _> = serde_json::from_str(&value);
40 match v {
41 Ok(json_value) => serde_json::to_string_pretty(&json_value).unwrap_or(value),
42 Err(_) => value,
43 }
44 }
45}
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn it_should_convert_a_value_to_json_string() {
53 let value_str = Value::json_to_value("{\"name\":\"John Doe\"}").unwrap();
54 let value_number = Value::json_to_value("{\"age\":30}").unwrap();
55 let value_boolean = Value::json_to_value("{\"is_active\":true}").unwrap();
56
57 assert_eq!(
58 "{\n \"name\": \"John Doe\"\n}",
59 value_str.to_json(JsonMode::Indented)
60 );
61 assert_eq!(
62 "{\n \"age\": 30\n}",
63 value_number.to_json(JsonMode::Indented)
64 );
65 assert_eq!(
66 "{\n \"is_active\": true\n}",
67 value_boolean.to_json(JsonMode::Indented)
68 );
69 }
70
71 #[test]
72 fn it_should_complex_string() {
73 let string = r#"1 1763496849266 https://mercado.carrefour.com.br/mapa-do-site/1 <!DOCTYPE html><html lang="pt-BR"><head><link href="https://cdn-prod.securiti.ai/consent/cookie-consent-latest.css" rel="stylesheet"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0"><title>Mapa do Site | Supermercado Carrefour</title><meta name="robots" content="index,follow"><meta name="description" content="O Carrefour também tem supermercado online! Faça sua lista de compras e aproveite nosso delivery. Aproveite!"><meta property="og:title" content="Mercado Carrefour: Ofertas de Supermercado Delivery"><meta property="og:description" content="O Carrefour também tem supermercado online! Faça sua lista de compras e aproveite nosso delivery. Aproveite!"><meta property="og:url" content="https://mercado.carrefour.com.br"><meta property="og:type" content="website"><link rel="canonical" href="https://mercado.carrefour.com.br"><meta name="next-head-count" content="10"><meta name="google-site-verification" content="GjAwJWf5U8gd7i0Tg-Dqz8LE0qi4RWdMWxfwsd-EgOY"><meta name="facebook-domain-verification" content="ym08vcfms00jx3fkqdkgqgsxrxbi8f"><meta name="facebook-domain-verification" content="ym08vcfms00jx3fkqdkgqgsxrxbi8f"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preload" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap" rel="preload"><link href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,700;1,300&display=swap" rel="preload"><link rel="preload" href="/_next/static/css/4a6cfdceadc6be2d.css" as="style"><link rel="stylesheet" href="/_next/static/css/4a6cfdceadc6be2d.css" data-n-g=""><link rel="preload" href="/_next/static/css/d2bb7ebb3aa1fe96.css" as="style"><link rel="stylesheet" href="/_next/static/css/d2bb7ebb3aa1fe96.css" data-n-p=""><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script data-partytown-config="">"#;
74 let value = Value::from(string);
75 let json_output = value.to_json(JsonMode::Indented);
76 let expected = r#""1 1763496849266 https://mercado.carrefour.com.br/mapa-do-site/1 <!DOCTYPE html><html lang=\"pt-BR\"><head><link href=\"https://cdn-prod.securiti.ai/consent/cookie-consent-latest.css\" rel=\"stylesheet\"><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0\"><title>Mapa do Site | Supermercado Carrefour</title><meta name=\"robots\" content=\"index,follow\"><meta name=\"description\" content=\"O Carrefour também tem supermercado online! Faça sua lista de compras e aproveite nosso delivery. Aproveite!\"><meta property=\"og:title\" content=\"Mercado Carrefour: Ofertas de Supermercado Delivery\"><meta property=\"og:description\" content=\"O Carrefour também tem supermercado online! Faça sua lista de compras e aproveite nosso delivery. Aproveite!\"><meta property=\"og:url\" content=\"https://mercado.carrefour.com.br\"><meta property=\"og:type\" content=\"website\"><link rel=\"canonical\" href=\"https://mercado.carrefour.com.br\"><meta name=\"next-head-count\" content=\"10\"><meta name=\"google-site-verification\" content=\"GjAwJWf5U8gd7i0Tg-Dqz8LE0qi4RWdMWxfwsd-EgOY\"><meta name=\"facebook-domain-verification\" content=\"ym08vcfms00jx3fkqdkgqgsxrxbi8f\"><meta name=\"facebook-domain-verification\" content=\"ym08vcfms00jx3fkqdkgqgsxrxbi8f\"><link rel=\"preconnect\" href=\"https://fonts.googleapis.com\"><link rel=\"preload\" href=\"https://fonts.googleapis.com\"><link href=\"https://fonts.googleapis.com/css2?family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap\" rel=\"preload\"><link href=\"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,700;1,300&display=swap\" rel=\"preload\"><link rel=\"preload\" href=\"/_next/static/css/4a6cfdceadc6be2d.css\" as=\"style\"><link rel=\"stylesheet\" href=\"/_next/static/css/4a6cfdceadc6be2d.css\" data-n-g=\"\"><link rel=\"preload\" href=\"/_next/static/css/d2bb7ebb3aa1fe96.css\" as=\"style\"><link rel=\"stylesheet\" href=\"/_next/static/css/d2bb7ebb3aa1fe96.css\" data-n-p=\"\"><noscript data-n-css=\"\"></noscript><script defer=\"\" nomodule=\"\" src=\"/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js\"></script><script data-partytown-config=\"\">""#;
78
79 assert_eq!(json_output, expected);
80 }
81}