1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use crate::schema::*;
// use std::str::FromStr;
// use std::convert::TryFrom;
use serde_json;

// impl FromStr for Vegalite {
//     type Err = serde_json::Error;

//     fn from_str(s: &str) -> Result<Self, Self::Err> {
//         serde_json::from_str(s)
//     }
// }

impl Vegalite {
    /// Render the json for a graph
    pub fn to_string(&self) -> Result<String, serde_json::Error> {
        serde_json::to_string(self)
    }
}

// impl TryFrom<&Vegalite> for String {
//     type Error = serde_json::Error;
//     fn try_from(v: &Vegalite) -> Result<Self, Self::Error> {
//         v.to_string()
//     }
// }

// for every enum with String(String)
macro_rules! from_into_string{
    ( $( $x:ident ),* $(,)? ) => {
            $(
                impl From<&str> for $x
                {
                    fn from(v: &str) -> Self {
                        $x::String(v.into())
                    }
                }
            )*
    };
}

from_into_string!(
    Title,
    SelectionOperandElement,
    PurpleSelectionOperand,
    LogicalOperandPredicateElement,
    PurpleLogicalOperandPredicate,
    EqualUnion,
    Day,
    Month,
    Lt,
    SelectionInitIntervalElement,
    Value,
    Field,
    ScaleRange,
    RangeRange,
    Scheme,
    TooltipUnion,
    Style,
    BindValue,
    InitSelectionInitMapping,
    Translate,
    InlineDatasetValue,
    UrlDataInlineDataset,
);

// #[cfg(test)]
// mod tests {
//     use super::*;

//     #[test]
//     fn test_from_string_to_string() {
//         let json1 = r#"
//             {
//                 "$schema": "https://vega.github.io/schema/vega-lite/v3.json",
//                 "description": "Google's stock price over time.",
//                 "data": {"url": "data/stocks.csv"},
//                 "transform": [{"filter": "datum.symbol==='GOOG'"}],
//                 "mark": "line",
//                 "encoding": {
//                     "x": {"field": "date", "type": "temporal"},
//                     "y": {"field": "price", "type": "quantitative"}
//                 }
//             }
//         "#;
//         let vega1 = Vegalite::from_str(json1).unwrap();
//         //dbg!(vega1);
//         //let json2 = vega1.to_string().unwrap();
//         //let vega2 = Vegalite::from_str(json2).unwrap();
//         //assert_eq!(json1, json2);
//         //assert_eq!(vega1, vega2);
//     }
// }