use serde::{Deserialize, Serialize};
use validator::Validate;
use crate::v2_1::datatypes::{
CustomDataType, DERCurveGetType, EnterServiceGetType, FixedPFGetType, FixedVarGetType,
FreqDroopGetType, GradientGetType, LimitMaxDischargeGetType,
};
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Validate)]
#[serde(rename_all = "camelCase")]
pub struct ReportDERControlRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_data: Option<CustomDataType>,
pub request_id: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub tbc: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 1, max = 24))]
pub curve: Option<Vec<DERCurveGetType>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 1, max = 24))]
pub enter_service: Option<Vec<EnterServiceGetType>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 1, max = 24))]
pub fixed_pf_absorb: Option<Vec<FixedPFGetType>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 1, max = 24))]
pub fixed_pf_inject: Option<Vec<FixedPFGetType>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 1, max = 24))]
pub fixed_var: Option<Vec<FixedVarGetType>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 1, max = 24))]
pub freq_droop: Option<Vec<FreqDroopGetType>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 1, max = 24))]
pub gradient: Option<Vec<GradientGetType>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 1, max = 24))]
pub limit_max_discharge: Option<Vec<LimitMaxDischargeGetType>>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Validate)]
#[serde(rename_all = "camelCase")]
pub struct ReportDERControlResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_data: Option<CustomDataType>,
}