valu3/to/
json.rs

1use crate::prelude::*;
2use regex::Regex;
3use serde_json::{self, Map, Value as SerdeValue};
4
5/// An enum representing the JSON output format mode.
6pub enum JsonMode {
7    /// Outputs the JSON in an indented format.
8    Indented,
9    /// Outputs the JSON in an inline format.
10    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    /// Converte o Value interno em serde_json::Value usando apenas APIs de serde.
33    fn to_serde_json_value(&self) -> std::result::Result<String, serde_json::Error> {
34        serde_json::to_string(&self)
35    }
36
37    /// Manual identação de strings JSON
38    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&amp;display=swap" rel="preload"><link href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,700;1,300&amp;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        // Esperado: objeto JSON com a chave "html" e a string com aspas internas escapadas
77        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&amp;display=swap\" rel=\"preload\"><link href=\"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,700;1,300&amp;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}