blob: 5ea9314e29cf98da2d13a0c536092b06b3aebb01 [file] [log] [blame]
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -07001// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "buffet/commands/prop_constraints.h"
Alex Vakulenko66ec2922014-06-17 15:30:22 -07006#include "buffet/commands/prop_values.h"
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -07007#include "buffet/commands/schema_constants.h"
8#include "buffet/string_utils.h"
9
10namespace buffet {
11
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070012// Constraint ----------------------------------------------------------------
13Constraint::~Constraint() {}
14
15bool Constraint::ReportErrorLessThan(
16 ErrorPtr* error, const std::string& val, const std::string& limit) {
17 Error::AddToPrintf(error, commands::errors::kDomain,
18 commands::errors::kOutOfRange,
19 "Value %s is out of range. It must not be less than %s",
20 val.c_str(), limit.c_str());
21 return false;
22}
23
24bool Constraint::ReportErrorGreaterThan(
25 ErrorPtr* error, const std::string& val, const std::string& limit) {
26 Error::AddToPrintf(error, commands::errors::kDomain,
27 commands::errors::kOutOfRange,
28 "Value %s is out of range. It must not be greater than %s",
29 val.c_str(), limit.c_str());
30 return false;
31}
32
33bool Constraint::ReportErrorNotOneOf(
34 ErrorPtr* error, const std::string& val,
35 const std::vector<std::string>& values) {
36 Error::AddToPrintf(error, commands::errors::kDomain,
37 commands::errors::kOutOfRange,
38 "Value %s is invalid. Expected one of [%s]",
39 val.c_str(), string_utils::Join(',', values).c_str());
40 return false;
41}
42
43bool Constraint::AddToJsonDict(base::DictionaryValue* dict,
44 bool overridden_only,
45 ErrorPtr* error) const {
46 if (!overridden_only || HasOverriddenAttributes()) {
47 auto value = ToJson(error);
48 if (!value)
49 return false;
50 dict->SetWithoutPathExpansion(GetDictKey(), value.release());
51 }
52 return true;
53}
54
55// ConstraintStringLength -----------------------------------------------------
56ConstraintStringLength::ConstraintStringLength(
57 const InheritableAttribute<int>& limit) : limit_(limit) {}
58ConstraintStringLength::ConstraintStringLength(int limit) : limit_(limit) {}
59
60bool ConstraintStringLength::HasOverriddenAttributes() const {
61 return !limit_.is_inherited;
62}
63
64std::unique_ptr<base::Value> ConstraintStringLength::ToJson(
65 ErrorPtr* error) const {
Alex Vakulenko66ec2922014-06-17 15:30:22 -070066 return TypedValueToJson(limit_.value, error);
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070067}
68
69// ConstraintStringLengthMin --------------------------------------------------
70ConstraintStringLengthMin::ConstraintStringLengthMin(
71 const InheritableAttribute<int>& limit) : ConstraintStringLength(limit) {}
72ConstraintStringLengthMin::ConstraintStringLengthMin(int limit)
73 : ConstraintStringLength(limit) {}
74
Alex Vakulenko66ec2922014-06-17 15:30:22 -070075bool ConstraintStringLengthMin::Validate(const PropValue& value,
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070076 ErrorPtr* error) const {
Alex Vakulenko66ec2922014-06-17 15:30:22 -070077 CHECK(value.GetString()) << "Expecting a string value for this constraint";
78 const std::string& str = value.GetString()->GetValue();
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070079 int length = static_cast<int>(str.size());
80 if (length < limit_.value) {
81 if (limit_.value == 1) {
82 Error::AddTo(error, commands::errors::kDomain,
83 commands::errors::kOutOfRange, "String must not be empty");
84 } else {
85 Error::AddToPrintf(error, commands::errors::kDomain,
86 commands::errors::kOutOfRange,
87 "String must be at least %d characters long, "
88 "actual length of string '%s' is %d", limit_.value,
89 str.c_str(), length);
90 }
91 return false;
92 }
93 return true;
94}
95
96std::shared_ptr<Constraint>
97 ConstraintStringLengthMin::CloneAsInherited() const {
98 return std::make_shared<ConstraintStringLengthMin>(limit_.value);
99}
100
101// ConstraintStringLengthMax --------------------------------------------------
102ConstraintStringLengthMax::ConstraintStringLengthMax(
103 const InheritableAttribute<int>& limit) : ConstraintStringLength(limit) {}
104ConstraintStringLengthMax::ConstraintStringLengthMax(int limit)
105 : ConstraintStringLength(limit) {}
106
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700107bool ConstraintStringLengthMax::Validate(const PropValue& value,
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700108 ErrorPtr* error) const {
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700109 CHECK(value.GetString()) << "Expecting a string value for this constraint";
110 const std::string& str = value.GetString()->GetValue();
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700111 int length = static_cast<int>(str.size());
112 if (length > limit_.value) {
113 Error::AddToPrintf(error, commands::errors::kDomain,
114 commands::errors::kOutOfRange,
115 "String must be no more than %d character(s) long, "
116 "actual length of string '%s' is %d", limit_.value,
117 str.c_str(), length);
118 return false;
119 }
120 return true;
121}
122
123std::shared_ptr<Constraint>
124 ConstraintStringLengthMax::CloneAsInherited() const {
125 return std::make_shared<ConstraintStringLengthMax>(limit_.value);
126}
127
128} // namespace buffet