chromium/chromeos/components/quick_answers/utils/unit_converter.h

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_COMPONENTS_QUICK_ANSWERS_UTILS_UNIT_CONVERTER_H_
#define CHROMEOS_COMPONENTS_QUICK_ANSWERS_UTILS_UNIT_CONVERTER_H_

#include <string>

#include "base/memory/raw_ref.h"
#include "base/values.h"

namespace quick_answers {

// Utility class for unit conversion.
class UnitConverter {
 public:
  explicit UnitConverter(const base::Value::List& rule_set);

  UnitConverter(const UnitConverter&) = delete;
  UnitConverter& operator=(const UnitConverter&) = delete;

  ~UnitConverter();

  // Convert the |src_value| from |src_unit| to |dst_unit|.
  const std::string Convert(const double src_value,
                            const base::Value::Dict& src_unit,
                            const base::Value::Dict& dst_unit);

  // Find the unit with the closest conversion rate within the preferred range.
  // Return nullptr if no proper unit type found.
  const base::Value::Dict* FindProperDestinationUnit(
      const base::Value::Dict& src_unit,
      const double preferred_range);

  // Get the list of conversion rates for the given category.
  const base::Value::Dict* GetConversionForCategory(
      const std::string& target_category);

  const base::Value::List* GetPossibleUnitsForCategory(
      const std::string& target_category);

 private:
  // Conversion rule set for supported unit types.
  // |rules_set_| needs to outlive the converter.
  const raw_ref<const base::Value::List> rule_set_;
};

}  // namespace quick_answers

#endif  // CHROMEOS_COMPONENTS_QUICK_ANSWERS_UTILS_UNIT_CONVERTER_H_