Select Git revision
lib.rs 11.65 KiB
// Copyright (C) 2019 Éloïs SANCHEZ
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//! JSON parser based on [pest](https://pest.rs).
//! It's is a personal crate for personal use.
//! The grammar used is a copy of the grammar proposed in the "pest book".
#![deny(
missing_debug_implementations,
missing_copy_implementations,
trivial_casts,
trivial_numeric_casts,
unsafe_code,
unstable_features,
unused_import_braces
)]
#[macro_use]
extern crate failure;
#[macro_use]
extern crate pest_derive;
#[cfg(test)]
#[macro_use]
extern crate pretty_assertions;
use failure::Error;
use pest::iterators::Pair;
use pest::Parser;
use std::collections::HashMap;
#[derive(Parser)]
#[grammar = "json_grammar.pest"]
struct JSONParser;
#[derive(Debug, PartialEq)]
pub enum JSONValue<'a, S: std::hash::BuildHasher> {
Object(HashMap<&'a str, JSONValue<'a, S>, S>),
Array(Vec<JSONValue<'a, S>>),
String(&'a str),
Number(f64),
Boolean(bool),
Null,
}
type JsonObject<'a, S> = HashMap<&'a str, JSONValue<'a, S>, S>;
impl<'a, S: std::hash::BuildHasher> JSONValue<'a, S> {
pub fn is_object(&self) -> bool {
if let JSONValue::Object(_) = self {
true
} else {
false
}
}
pub fn to_object(&self) -> Option<&HashMap<&'a str, JSONValue<'a, S>, S>> {
if let JSONValue::Object(object) = self {