use serde::{Deserialize, Serialize};
use crate::extract;
use super::ordered::OrderedMap;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FragDef {
pub id: String,
pub name: String,
pub namespace: String,
pub kind: String,
pub line: usize,
pub methods: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub properties: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub fields: Vec<String>,
#[serde(
default,
rename = "methodReturns",
skip_serializing_if = "OrderedMap::is_empty"
)]
pub method_returns: OrderedMap<String>,
#[serde(
default,
rename = "extensionMethods",
skip_serializing_if = "Vec::is_empty"
)]
pub extension_methods: Vec<FragExtensionMethod>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub bases: Vec<String>,
#[serde(default, rename = "typeParams", skip_serializing_if = "Vec::is_empty")]
pub type_params: Vec<String>,
#[serde(
default,
rename = "baseGenericArgs",
skip_serializing_if = "OrderedMap::is_empty"
)]
pub base_generic_args: OrderedMap<Vec<String>>,
#[serde(default, rename = "testMethods", skip_serializing_if = "Vec::is_empty")]
pub test_methods: Vec<String>,
#[serde(
default,
rename = "propertyTypes",
skip_serializing_if = "OrderedMap::is_empty"
)]
pub property_types: OrderedMap<FragFact>,
#[serde(
default,
rename = "fieldTypes",
skip_serializing_if = "OrderedMap::is_empty"
)]
pub field_types: OrderedMap<FragFact>,
#[serde(
default,
rename = "methodReturnArgs",
skip_serializing_if = "OrderedMap::is_empty"
)]
pub method_return_args: OrderedMap<Vec<String>>,
#[serde(
default,
rename = "nonPublicMethods",
skip_serializing_if = "Vec::is_empty"
)]
pub non_public_methods: Vec<String>,
#[serde(
default,
rename = "methodArities",
skip_serializing_if = "OrderedMap::is_empty"
)]
pub method_arities: OrderedMap<Vec<(usize, i64)>>,
#[serde(
default,
rename = "methodParams",
skip_serializing_if = "OrderedMap::is_empty"
)]
pub method_params: OrderedMap<Vec<Vec<String>>>,
#[serde(
default,
rename = "overrideMethods",
skip_serializing_if = "Vec::is_empty"
)]
pub override_methods: Vec<String>,
#[serde(default, rename = "endLine", skip_serializing_if = "is_zero")]
pub end_line: usize,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FragRegistration {
pub service: String,
pub implementation: String,
pub namespace: String,
pub line: usize,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FragFact {
#[serde(rename = "type")]
pub type_name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub args: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FragExtensionMethod {
pub name: String,
#[serde(rename = "thisType")]
pub this_type: String,
#[serde(rename = "arityMin")]
pub arity_min: usize,
#[serde(rename = "arityMax")]
pub arity_max: i64,
#[serde(default, rename = "thisArgs", skip_serializing_if = "Option::is_none")]
pub this_args: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FragLambdaSlot {
pub owner: String,
pub member: String,
pub arg_count: usize,
pub arg_index: usize,
pub arity: usize,
pub index: usize,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum FragUsing {
Alias {
alias: String,
target: String,
global: bool,
},
Plain {
text: String,
global: bool,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FragRef {
pub kind: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub qualified: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub member: Option<String>,
pub line: usize,
pub namespace: Option<String>,
#[serde(
default,
rename = "typeArgCount",
skip_serializing_if = "Option::is_none"
)]
pub type_arg_count: Option<usize>,
#[serde(default, skip_serializing_if = "is_false")]
pub generic: bool,
#[serde(
default,
rename = "receiverType",
skip_serializing_if = "Option::is_none"
)]
pub receiver_type: Option<String>,
#[serde(default, rename = "argCount", skip_serializing_if = "Option::is_none")]
pub arg_count: Option<usize>,
#[serde(
default,
rename = "receiverArgs",
skip_serializing_if = "Option::is_none"
)]
pub receiver_args: Option<Vec<String>>,
#[serde(default, rename = "outerTypes", skip_serializing_if = "Vec::is_empty")]
pub outer_types: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub args: Option<Vec<String>>,
#[serde(
default,
rename = "receiverPropertyOwner",
skip_serializing_if = "Option::is_none"
)]
pub receiver_property_owner: Option<String>,
#[serde(
default,
rename = "receiverCallOwner",
skip_serializing_if = "Option::is_none"
)]
pub receiver_call_owner: Option<String>,
#[serde(
default,
rename = "receiverCallMember",
skip_serializing_if = "Option::is_none"
)]
pub receiver_call_member: Option<String>,
#[serde(default, rename = "receiverBase", skip_serializing_if = "is_false")]
pub receiver_base: bool,
#[serde(default, rename = "receiverAwaited", skip_serializing_if = "is_false")]
pub receiver_awaited: bool,
#[serde(default, rename = "receiverLocal", skip_serializing_if = "is_false")]
pub receiver_local: bool,
#[serde(
default,
rename = "receiverLambda",
skip_serializing_if = "Option::is_none"
)]
pub receiver_lambda: Option<FragLambdaSlot>,
}
pub(crate) fn is_false(b: &bool) -> bool {
!*b
}
pub(crate) fn is_zero(n: &usize) -> bool {
*n == 0
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FragName {
pub name: String,
pub kind: String,
pub line: usize,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub owner: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Fragment {
pub defs: Vec<FragDef>,
pub usings: Vec<FragUsing>,
pub refs: Vec<FragRef>,
#[serde(default)]
pub names: Vec<FragName>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub registrations: Vec<FragRegistration>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum AnyFragment {
Ts(extract::TsFragment),
Cs(Fragment),
}
impl From<Fragment> for AnyFragment {
fn from(f: Fragment) -> Self {
AnyFragment::Cs(f)
}
}
impl From<extract::TsFragment> for AnyFragment {
fn from(f: extract::TsFragment) -> Self {
AnyFragment::Ts(f)
}
}