Parametric.policy(:nullable_integer) do
  PARAMETRIC_INT_EXP = /^\d+$/.freeze

  coerce do |value, _key, _context|
    if value.to_s =~ PARAMETRIC_INT_EXP
      value.to_i
    else
      nil
    end
  end

  meta_data do
    { type: :integer }
  end
end

Parametric.policy(:nullable_date) do
  PARAMETRIC_DATE_EXP = /^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i.freeze

  coerce do |value, _key, _context|
    if value.to_s =~ PARAMETRIC_DATE_EXP
      Date.parse(value.to_s)
    else
      nil
    end
  end

  meta_data do
    { type: :date }
  end
end