use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::{
ContractDefinition, EnumDefinition, ErrorDefinition, FunctionDefinition, NodeID,
StructDefinition, UserDefinedValueTypeDefinition, UsingForDirective, VariableDeclaration,
};
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(tag = "nodeType")]
pub enum SourceUnitNode {
PragmaDirective(PragmaDirective),
ImportDirective(ImportDirective),
ContractDefinition(ContractDefinition),
FunctionDefinition(FunctionDefinition),
StructDefinition(StructDefinition),
EnumDefinition(EnumDefinition),
ErrorDefinition(ErrorDefinition),
UsingForDirective(UsingForDirective),
VariableDeclaration(VariableDeclaration),
UserDefinedValueTypeDefinition(UserDefinedValueTypeDefinition),
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct PragmaDirective {
pub id: NodeID,
pub src: String,
#[serde(default)]
pub literals: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct ImportDirective {
pub id: NodeID,
pub src: String,
#[serde(default)]
pub file: Option<String>,
#[serde(default)]
pub absolute_path: Option<String>,
#[serde(default)]
pub unit_alias: Option<String>,
#[serde(default)]
pub name_location: Option<String>,
#[serde(default)]
pub source_unit: Option<NodeID>,
#[serde(default)]
pub scope: Option<NodeID>,
#[serde(default)]
pub symbol_aliases: Vec<serde_json::Value>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct SourceUnit {
pub id: NodeID,
pub src: String,
#[serde(default)]
pub absolute_path: Option<String>,
#[serde(default)]
pub license: Option<String>,
#[serde(default)]
pub exported_symbols: HashMap<String, Vec<NodeID>>,
#[serde(default)]
pub nodes: Vec<SourceUnitNode>,
}