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

#ifndef MediaSettingsRange_h
#define MediaSettingsRange_h

#include "bindings/core/v8/ScriptWrappable.h"
#include "media/capture/mojo/image_capture.mojom-blink.h"

namespace blink {

class MediaSettingsRange final : public GarbageCollected<MediaSettingsRange>,
                                 public ScriptWrappable {
  DEFINE_WRAPPERTYPEINFO();

 public:
  static MediaSettingsRange* create(double max,
                                    double min,
                                    double current,
                                    double step) {
    return new MediaSettingsRange(max, min, current, step);
  }
  static MediaSettingsRange* create(media::mojom::blink::RangePtr range) {
    return MediaSettingsRange::create(*range);
  }
  static MediaSettingsRange* create(const media::mojom::blink::Range& range) {
    return MediaSettingsRange::create(range.max, range.min, range.current,
                                      range.step);
  }

  double max() const { return m_max; }
  double min() const { return m_min; }
  double current() const { return m_current; }
  double step() const { return m_step; }

  DEFINE_INLINE_TRACE() {}

 private:
  MediaSettingsRange(double max, double min, double current, double step)
      : m_max(max), m_min(min), m_current(current), m_step(step) {}

  double m_max;
  double m_min;
  double m_current;
  double m_step;
};

}  // namespace blink

#endif  // MediaSettingsRange_h
