// API facts derived from Prometheus v3.14.0 (Apache-2.0); see THIRD_PARTY_NOTICES.md.
// Generated by tools/generate-tables.py using the unmodified reference parser.

///|
pub(all) struct FunctionSignature {
  name : String
  arguments : Array[QueryType]
  min_args : Int
  max_args : Int?
  result : QueryType
  experimental : Bool
} derive(Debug, Eq, ToJson)

///|
fn function_signature(name : String) -> FunctionSignature? {
  match name {
    "abs" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "absent" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "absent_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "acos" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "acosh" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "asin" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "asinh" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "atan" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "atanh" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "avg_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "ceil" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "changes" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "clamp" =>
      Some({
        name,
        arguments: [InstantVector, Scalar, Scalar],
        min_args: 3,
        max_args: Some(3),
        result: InstantVector,
        experimental: false,
      })
    "clamp_max" =>
      Some({
        name,
        arguments: [InstantVector, Scalar],
        min_args: 2,
        max_args: Some(2),
        result: InstantVector,
        experimental: false,
      })
    "clamp_min" =>
      Some({
        name,
        arguments: [InstantVector, Scalar],
        min_args: 2,
        max_args: Some(2),
        result: InstantVector,
        experimental: false,
      })
    "cos" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "cosh" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "count_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "day_of_month" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 0,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "day_of_week" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 0,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "day_of_year" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 0,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "days_in_month" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 0,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "deg" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "delta" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "deriv" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "double_exponential_smoothing" =>
      Some({
        name,
        arguments: [RangeVector, Scalar, Scalar],
        min_args: 3,
        max_args: Some(3),
        result: InstantVector,
        experimental: true,
      })
    "end" =>
      Some({
        name,
        arguments: [],
        min_args: 0,
        max_args: Some(0),
        result: Scalar,
        experimental: true,
      })
    "exp" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "first_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "floor" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "histogram_avg" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "histogram_count" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "histogram_fraction" =>
      Some({
        name,
        arguments: [Scalar, Scalar, InstantVector],
        min_args: 3,
        max_args: Some(3),
        result: InstantVector,
        experimental: false,
      })
    "histogram_quantile" =>
      Some({
        name,
        arguments: [Scalar, InstantVector],
        min_args: 2,
        max_args: Some(2),
        result: InstantVector,
        experimental: false,
      })
    "histogram_quantiles" =>
      Some({
        name,
        arguments: [InstantVector, StringValue, Scalar, Scalar],
        min_args: 3,
        max_args: Some(12),
        result: InstantVector,
        experimental: true,
      })
    "histogram_stddev" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "histogram_stdvar" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "histogram_sum" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "hour" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 0,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "idelta" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "increase" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "info" =>
      Some({
        name,
        arguments: [InstantVector, InstantVector],
        min_args: 1,
        max_args: Some(2),
        result: InstantVector,
        experimental: true,
      })
    "irate" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "label_join" =>
      Some({
        name,
        arguments: [InstantVector, StringValue, StringValue, StringValue],
        min_args: 3,
        max_args: None,
        result: InstantVector,
        experimental: false,
      })
    "label_replace" =>
      Some({
        name,
        arguments: [
          InstantVector,
          StringValue,
          StringValue,
          StringValue,
          StringValue,
        ],
        min_args: 5,
        max_args: Some(5),
        result: InstantVector,
        experimental: false,
      })
    "last_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "ln" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "log10" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "log2" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "mad_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: true,
      })
    "max_of" =>
      Some({
        name,
        arguments: [Scalar, Scalar],
        min_args: 2,
        max_args: Some(2),
        result: Scalar,
        experimental: true,
      })
    "max_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "min_of" =>
      Some({
        name,
        arguments: [Scalar, Scalar],
        min_args: 2,
        max_args: Some(2),
        result: Scalar,
        experimental: true,
      })
    "min_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "minute" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 0,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "month" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 0,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "pi" =>
      Some({
        name,
        arguments: [],
        min_args: 0,
        max_args: Some(0),
        result: Scalar,
        experimental: false,
      })
    "predict_linear" =>
      Some({
        name,
        arguments: [RangeVector, Scalar],
        min_args: 2,
        max_args: Some(2),
        result: InstantVector,
        experimental: false,
      })
    "present_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "quantile_over_time" =>
      Some({
        name,
        arguments: [Scalar, RangeVector],
        min_args: 2,
        max_args: Some(2),
        result: InstantVector,
        experimental: false,
      })
    "rad" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "range" =>
      Some({
        name,
        arguments: [],
        min_args: 0,
        max_args: Some(0),
        result: Scalar,
        experimental: true,
      })
    "rate" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "resets" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "round" =>
      Some({
        name,
        arguments: [InstantVector, Scalar],
        min_args: 1,
        max_args: Some(2),
        result: InstantVector,
        experimental: false,
      })
    "scalar" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: Scalar,
        experimental: false,
      })
    "sgn" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "sin" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "sinh" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "sort" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "sort_by_label" =>
      Some({
        name,
        arguments: [InstantVector, StringValue],
        min_args: 1,
        max_args: None,
        result: InstantVector,
        experimental: true,
      })
    "sort_by_label_desc" =>
      Some({
        name,
        arguments: [InstantVector, StringValue],
        min_args: 1,
        max_args: None,
        result: InstantVector,
        experimental: true,
      })
    "sort_desc" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "sqrt" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "start" =>
      Some({
        name,
        arguments: [],
        min_args: 0,
        max_args: Some(0),
        result: Scalar,
        experimental: true,
      })
    "start_timestamp" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: true,
      })
    "stddev_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "stdvar_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "step" =>
      Some({
        name,
        arguments: [],
        min_args: 0,
        max_args: Some(0),
        result: Scalar,
        experimental: true,
      })
    "sum_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "tan" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "tanh" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "time" =>
      Some({
        name,
        arguments: [],
        min_args: 0,
        max_args: Some(0),
        result: Scalar,
        experimental: false,
      })
    "timestamp" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "ts_of_first_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: true,
      })
    "ts_of_last_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: true,
      })
    "ts_of_max_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: true,
      })
    "ts_of_min_over_time" =>
      Some({
        name,
        arguments: [RangeVector],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: true,
      })
    "vector" =>
      Some({
        name,
        arguments: [Scalar],
        min_args: 1,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    "year" =>
      Some({
        name,
        arguments: [InstantVector],
        min_args: 0,
        max_args: Some(1),
        result: InstantVector,
        experimental: false,
      })
    _ => None
  }
}

///|
pub fn function_signatures() -> Array[FunctionSignature] {
  [
    "abs", "absent", "absent_over_time", "acos", "acosh", "asin", "asinh", "atan",
    "atanh", "avg_over_time", "ceil", "changes", "clamp", "clamp_max", "clamp_min",
    "cos", "cosh", "count_over_time", "day_of_month", "day_of_week", "day_of_year",
    "days_in_month", "deg", "delta", "deriv", "double_exponential_smoothing", "end",
    "exp", "first_over_time", "floor", "histogram_avg", "histogram_count", "histogram_fraction",
    "histogram_quantile", "histogram_quantiles", "histogram_stddev", "histogram_stdvar",
    "histogram_sum", "hour", "idelta", "increase", "info", "irate", "label_join",
    "label_replace", "last_over_time", "ln", "log10", "log2", "mad_over_time", "max_of",
    "max_over_time", "min_of", "min_over_time", "minute", "month", "pi", "predict_linear",
    "present_over_time", "quantile_over_time", "rad", "range", "rate", "resets",
    "round", "scalar", "sgn", "sin", "sinh", "sort", "sort_by_label", "sort_by_label_desc",
    "sort_desc", "sqrt", "start", "start_timestamp", "stddev_over_time", "stdvar_over_time",
    "step", "sum_over_time", "tan", "tanh", "time", "timestamp", "ts_of_first_over_time",
    "ts_of_last_over_time", "ts_of_max_over_time", "ts_of_min_over_time", "vector",
    "year",
  ].map(name => function_signature(name).unwrap())
}