// This file was generated by Cobalt's Registry parser based on the registry YAML
// in the cobalt_config repository. Edit the YAML there to make changes.
pub const CUSTOMER_NAME: &str = "the_customer";
pub const CUSTOMER_ID: u32 = 10;
pub const PROJECT_NAME: &str = "the_project";
pub const PROJECT_ID: u32 = 5;

// Linear bucket constants for linear buckets
pub const LINEAR_BUCKETS_INT_BUCKETS_FLOOR: i64 = 0;
pub const LINEAR_BUCKETS_INT_BUCKETS_NUM_BUCKETS: u32 = 140;
pub const LINEAR_BUCKETS_INT_BUCKETS_STEP_SIZE: u32 = 5;

// Exponential bucket constants for exponential buckets report
pub const EXPONENTIAL_BUCKETS_REPORT_INT_BUCKETS_FLOOR: i64 = 0;
pub const EXPONENTIAL_BUCKETS_REPORT_INT_BUCKETS_NUM_BUCKETS: u32 = 3;
pub const EXPONENTIAL_BUCKETS_REPORT_INT_BUCKETS_INITIAL_STEP: u32 = 2;
pub const EXPONENTIAL_BUCKETS_REPORT_INT_BUCKETS_STEP_MULTIPLIER: u32 = 2;

// Metric ID Constants
// the_metric_name
pub const THE_METRIC_NAME_METRIC_ID: u32 = 100;
// the_other_metric_name
pub const THE_OTHER_METRIC_NAME_METRIC_ID: u32 = 200;
// event groups
pub const EVENT_GROUPS_METRIC_ID: u32 = 300;
// linear buckets
pub const LINEAR_BUCKETS_METRIC_ID: u32 = 400;
// exponential buckets
pub const EXPONENTIAL_BUCKETS_METRIC_ID: u32 = 500;
// metric
pub const METRIC_METRIC_ID: u32 = 600;
// second metric
pub const SECOND_METRIC_METRIC_ID: u32 = 601;

// Enum for the_other_metric_name (Metric Dimension 0)
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
pub enum TheOtherMetricNameMetricDimension0 {
  AnEvent = 0,
  AnotherEvent = 1,
  AThirdEvent = 2,
}

impl cobalt_client::traits::AsEventCode for TheOtherMetricNameMetricDimension0 {
  fn as_event_code(&self) -> u32 {
    *self as u32
  }
}

// Alias for event groups (Metric Dimension The First Group) which has the same event codes
pub use TheOtherMetricNameMetricDimension0 as EventGroupsMetricDimensionTheFirstGroup;

// Enum for the_project (Metric Dimension A second group)
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
pub enum TheProjectMetricDimensionASecondGroup {
  This = 1,
  Is = 2,
  Another = 3,
  Test = 4,
}

impl cobalt_client::traits::AsEventCode for TheProjectMetricDimensionASecondGroup {
  fn as_event_code(&self) -> u32 {
    *self as u32
  }
}
// Alias for event groups (Metric Dimension A second group) which has the same event codes
pub use TheProjectMetricDimensionASecondGroup as EventGroupsMetricDimensionASecondGroup;

// Enum for the_project (Metric Dimension 2)
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
pub enum TheProjectMetricDimension2 {
  ThisMetric = 0,
  HasNo = 2,
  Name = 4,
}
impl TheProjectMetricDimension2 {
  #[allow(non_upper_case_globals)]
  pub const Alias: TheProjectMetricDimension2 = TheProjectMetricDimension2::HasNo;
}

impl cobalt_client::traits::AsEventCode for TheProjectMetricDimension2 {
  fn as_event_code(&self) -> u32 {
    *self as u32
  }
}
// Alias for event groups (Metric Dimension 2) which has the same event codes
pub use TheProjectMetricDimension2 as EventGroupsMetricDimension2;

// Enum for the_project (Metric Dimension First)
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
pub enum TheProjectMetricDimensionFirst {
  A = 1,
  Set = 2,
  OfEvent = 3,
  Codes = 4,
}

impl cobalt_client::traits::AsEventCode for TheProjectMetricDimensionFirst {
  fn as_event_code(&self) -> u32 {
    *self as u32
  }
}
// Alias for metric (Metric Dimension First) which has the same event codes
pub use TheProjectMetricDimensionFirst as MetricMetricDimensionFirst;

// Alias for second metric (Metric Dimension First) which has the same event codes
pub use TheProjectMetricDimensionFirst as SecondMetricMetricDimensionFirst;

// Enum for the_project (Metric Dimension Second)
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
pub enum TheProjectMetricDimensionSecond {
  Some = 0,
  More = 4,
  Event = 8,
  Codes = 16,
}

impl cobalt_client::traits::AsEventCode for TheProjectMetricDimensionSecond {
  fn as_event_code(&self) -> u32 {
    *self as u32
  }
}
// Alias for metric (Metric Dimension Second) which has the same event codes
pub use TheProjectMetricDimensionSecond as MetricMetricDimensionSecond;

// Alias for second metric (Metric Dimension Second) which has the same event codes
pub use TheProjectMetricDimensionSecond as SecondMetricMetricDimensionSecond;

#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
pub struct EventGroupsEventCodes {
  pub the_first_group: EventGroupsMetricDimensionTheFirstGroup,
  pub a_second_group: EventGroupsMetricDimensionASecondGroup,
  pub dimension_2: EventGroupsMetricDimension2,
}

impl cobalt_client::traits::AsEventCodes for EventGroupsEventCodes {
  fn as_event_codes(&self) -> Vec<u32> {
    use cobalt_client::traits::AsEventCode;
    vec![
      self.the_first_group.as_event_code(),
      self.a_second_group.as_event_code(),
      self.dimension_2.as_event_code(),
    ]
  }
}

#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
pub struct MetricEventCodes {
  pub first: MetricMetricDimensionFirst,
  pub second: MetricMetricDimensionSecond,
}

impl cobalt_client::traits::AsEventCodes for MetricEventCodes {
  fn as_event_codes(&self) -> Vec<u32> {
    use cobalt_client::traits::AsEventCode;
    vec![
      self.first.as_event_code(),
      self.second.as_event_code(),
    ]
  }
}

#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
pub struct SecondMetricEventCodes {
  pub first: SecondMetricMetricDimensionFirst,
  pub second: SecondMetricMetricDimensionSecond,
}

impl cobalt_client::traits::AsEventCodes for SecondMetricEventCodes {
  fn as_event_codes(&self) -> Vec<u32> {
    use cobalt_client::traits::AsEventCode;
    vec![
      self.first.as_event_code(),
      self.second.as_event_code(),
    ]
  }
}

// The base64 encoding of the bytes of a serialized CobaltRegistry proto message.
pub const CONFIG: &str = "KpgGCgx0aGVfY3VzdG9tZXIQChqFBgoLdGhlX3Byb2plY3QQBRpMCg90aGVfbWV0cmljX25hbWUQChgFIGRiGwoKdGhlX3JlcG9ydBAKGAvCBgjR/KsX0vyrF2IWChB0aGVfb3RoZXJfcmVwb3J0EBQYEhpsChV0aGVfb3RoZXJfbWV0cmljX25hbWUQChgFIMgBKAhQAWIQCgp0aGVfcmVwb3J0EAoYC4IBNRILCAASB0FuRXZlbnQSEAgBEgxBbm90aGVyRXZlbnQSEQgCEg1BIHRoaXJkIGV2ZW50GMgBGuoBCgxldmVudCBncm91cHMQChgFIKwCKAhQAWITCgp0aGVfcmVwb3J0EB4YC6ABAoIBRQoPVGhlIEZpcnN0IEdyb3VwEgsIABIHQW5FdmVudBIQCAESDEFub3RoZXJFdmVudBIRCAISDUEgdGhpcmQgZXZlbnQYAoIBOQoOQSBzZWNvbmQgZ3JvdXASCAgBEgRUaGlzEgYIAhICSXMSCwgDEgdhbm90aGVyEggIBBIEVGVzdIIBNRIOCAASClRoaXNNZXRyaWMSCQgCEgVIYXNObxIICAQSBE5hbWUqDgoFSGFzTm8SBUFsaWFzGiAKDmxpbmVhciBidWNrZXRzEAoYBSCQA0IHEgUQjAEYBRoyChNleHBvbmVudGlhbCBidWNrZXRzEAoYBSD0A2IUCgZyZXBvcnQQKFIICgYQAxgCIAIadgoGbWV0cmljEAoYBSDYBIIBLwoFRmlyc3QSBQgBEgFBEgcIAhIDU2V0EgsIAxIHT2ZFdmVudBIJCAQSBUNvZGVzggEyCgZTZWNvbmQSCAgAEgRTb21lEggIBBIETW9yZRIJCAgSBUV2ZW50EgkIEBIFQ29kZXMafQoNc2Vjb25kIG1ldHJpYxAKGAUg2QSCAS8KBUZpcnN0EgUIARIBQRIHCAISA1NldBILCAMSB09mRXZlbnQSCQgEEgVDb2Rlc4IBMgoGU2Vjb25kEggIABIEU29tZRIICAQSBE1vcmUSCQgIEgVFdmVudBIJCBASBUNvZGVz";
