blob: c9008d21ce9e93f41af0860a648da19c95179ab3 [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"
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -07008
9namespace buffet {
10
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070011// Constraint ----------------------------------------------------------------
12Constraint::~Constraint() {}
13
Alex Vakulenko5f472062014-08-14 17:54:04 -070014bool Constraint::ReportErrorLessThan(chromeos::ErrorPtr* error,
15 const std::string& val,
16 const std::string& limit) {
17 chromeos::Error::AddToPrintf(
18 error, errors::commands::kDomain,
19 errors::commands::kOutOfRange,
20 "Value %s is out of range. It must not be less than %s",
21 val.c_str(), limit.c_str());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070022 return false;
23}
24
Alex Vakulenko5f472062014-08-14 17:54:04 -070025bool Constraint::ReportErrorGreaterThan(chromeos::ErrorPtr* error,
26 const std::string& val,
27 const std::string& limit) {
28 chromeos::Error::AddToPrintf(
29 error, errors::commands::kDomain,
30 errors::commands::kOutOfRange,
31 "Value %s is out of range. It must not be greater than %s",
32 val.c_str(), limit.c_str());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070033 return false;
34}
35
Alex Vakulenko5f472062014-08-14 17:54:04 -070036bool Constraint::ReportErrorNotOneOf(chromeos::ErrorPtr* error,
37 const std::string& val,
38 const std::vector<std::string>& values) {
39 chromeos::Error::AddToPrintf(error, errors::commands::kDomain,
40 errors::commands::kOutOfRange,
41 "Value %s is invalid. Expected one of [%s]",
42 val.c_str(),
Alex Vakulenkob8fc1df2014-08-20 15:38:07 -070043 chromeos::string_utils::Join(',',
44 values).c_str());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070045 return false;
46}
47
48bool Constraint::AddToJsonDict(base::DictionaryValue* dict,
49 bool overridden_only,
Alex Vakulenko5f472062014-08-14 17:54:04 -070050 chromeos::ErrorPtr* error) const {
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070051 if (!overridden_only || HasOverriddenAttributes()) {
52 auto value = ToJson(error);
53 if (!value)
54 return false;
55 dict->SetWithoutPathExpansion(GetDictKey(), value.release());
56 }
57 return true;
58}
59
60// ConstraintStringLength -----------------------------------------------------
61ConstraintStringLength::ConstraintStringLength(
62 const InheritableAttribute<int>& limit) : limit_(limit) {}
63ConstraintStringLength::ConstraintStringLength(int limit) : limit_(limit) {}
64
65bool ConstraintStringLength::HasOverriddenAttributes() const {
66 return !limit_.is_inherited;
67}
68
69std::unique_ptr<base::Value> ConstraintStringLength::ToJson(
Alex Vakulenko5f472062014-08-14 17:54:04 -070070 chromeos::ErrorPtr* error) const {
Alex Vakulenko66ec2922014-06-17 15:30:22 -070071 return TypedValueToJson(limit_.value, error);
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070072}
73
74// ConstraintStringLengthMin --------------------------------------------------
75ConstraintStringLengthMin::ConstraintStringLengthMin(
76 const InheritableAttribute<int>& limit) : ConstraintStringLength(limit) {}
77ConstraintStringLengthMin::ConstraintStringLengthMin(int limit)
78 : ConstraintStringLength(limit) {}
79
Alex Vakulenko66ec2922014-06-17 15:30:22 -070080bool ConstraintStringLengthMin::Validate(const PropValue& value,
Alex Vakulenko5f472062014-08-14 17:54:04 -070081 chromeos::ErrorPtr* error) const {
Alex Vakulenko66ec2922014-06-17 15:30:22 -070082 CHECK(value.GetString()) << "Expecting a string value for this constraint";
83 const std::string& str = value.GetString()->GetValue();
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070084 int length = static_cast<int>(str.size());
85 if (length < limit_.value) {
86 if (limit_.value == 1) {
Alex Vakulenko5f472062014-08-14 17:54:04 -070087 chromeos::Error::AddTo(error, errors::commands::kDomain,
88 errors::commands::kOutOfRange,
89 "String must not be empty");
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070090 } else {
Alex Vakulenko5f472062014-08-14 17:54:04 -070091 chromeos::Error::AddToPrintf(error, errors::commands::kDomain,
92 errors::commands::kOutOfRange,
93 "String must be at least %d characters long,"
94 " actual length of string '%s' is %d",
95 limit_.value, str.c_str(), length);
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070096 }
97 return false;
98 }
99 return true;
100}
101
102std::shared_ptr<Constraint>
103 ConstraintStringLengthMin::CloneAsInherited() const {
104 return std::make_shared<ConstraintStringLengthMin>(limit_.value);
105}
106
107// ConstraintStringLengthMax --------------------------------------------------
108ConstraintStringLengthMax::ConstraintStringLengthMax(
109 const InheritableAttribute<int>& limit) : ConstraintStringLength(limit) {}
110ConstraintStringLengthMax::ConstraintStringLengthMax(int limit)
111 : ConstraintStringLength(limit) {}
112
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700113bool ConstraintStringLengthMax::Validate(const PropValue& value,
Alex Vakulenko5f472062014-08-14 17:54:04 -0700114 chromeos::ErrorPtr* error) const {
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700115 CHECK(value.GetString()) << "Expecting a string value for this constraint";
116 const std::string& str = value.GetString()->GetValue();
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700117 int length = static_cast<int>(str.size());
118 if (length > limit_.value) {
Alex Vakulenko5f472062014-08-14 17:54:04 -0700119 chromeos::Error::AddToPrintf(error, errors::commands::kDomain,
120 errors::commands::kOutOfRange,
121 "String must be no more than %d character(s) "
122 "long, actual length of string '%s' is %d",
123 limit_.value, str.c_str(), length);
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700124 return false;
125 }
126 return true;
127}
128
129std::shared_ptr<Constraint>
130 ConstraintStringLengthMax::CloneAsInherited() const {
131 return std::make_shared<ConstraintStringLengthMax>(limit_.value);
132}
133
134} // namespace buffet