blob: 641d0f6ebfbf977642010ce11a4c225dfe7d2549 [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 Deymof6cbe322014-11-10 19:55:35 -08006
Alex Vakulenko66ec2922014-06-17 15:30:22 -07007#include "buffet/commands/prop_values.h"
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -07008#include "buffet/commands/schema_constants.h"
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -07009
10namespace buffet {
11
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070012// Constraint ----------------------------------------------------------------
13Constraint::~Constraint() {}
14
Alex Vakulenko5f472062014-08-14 17:54:04 -070015bool Constraint::ReportErrorLessThan(chromeos::ErrorPtr* error,
16 const std::string& val,
17 const std::string& limit) {
18 chromeos::Error::AddToPrintf(
Alex Vakulenkoac8037d2014-11-11 11:42:05 -080019 error, FROM_HERE, errors::commands::kDomain,
Alex Vakulenko5f472062014-08-14 17:54:04 -070020 errors::commands::kOutOfRange,
21 "Value %s is out of range. It must not be less than %s",
22 val.c_str(), limit.c_str());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070023 return false;
24}
25
Alex Vakulenko5f472062014-08-14 17:54:04 -070026bool Constraint::ReportErrorGreaterThan(chromeos::ErrorPtr* error,
27 const std::string& val,
28 const std::string& limit) {
29 chromeos::Error::AddToPrintf(
Alex Vakulenkoac8037d2014-11-11 11:42:05 -080030 error, FROM_HERE, errors::commands::kDomain,
Alex Vakulenko5f472062014-08-14 17:54:04 -070031 errors::commands::kOutOfRange,
32 "Value %s is out of range. It must not be greater than %s",
33 val.c_str(), limit.c_str());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070034 return false;
35}
36
Alex Vakulenko5f472062014-08-14 17:54:04 -070037bool Constraint::ReportErrorNotOneOf(chromeos::ErrorPtr* error,
38 const std::string& val,
39 const std::vector<std::string>& values) {
Alex Vakulenkoac8037d2014-11-11 11:42:05 -080040 chromeos::Error::AddToPrintf(error, FROM_HERE, errors::commands::kDomain,
Alex Vakulenko5f472062014-08-14 17:54:04 -070041 errors::commands::kOutOfRange,
42 "Value %s is invalid. Expected one of [%s]",
43 val.c_str(),
Alex Vakulenkob8fc1df2014-08-20 15:38:07 -070044 chromeos::string_utils::Join(',',
45 values).c_str());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070046 return false;
47}
48
49bool Constraint::AddToJsonDict(base::DictionaryValue* dict,
50 bool overridden_only,
Alex Vakulenko5f472062014-08-14 17:54:04 -070051 chromeos::ErrorPtr* error) const {
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070052 if (!overridden_only || HasOverriddenAttributes()) {
53 auto value = ToJson(error);
54 if (!value)
55 return false;
56 dict->SetWithoutPathExpansion(GetDictKey(), value.release());
57 }
58 return true;
59}
60
61// ConstraintStringLength -----------------------------------------------------
62ConstraintStringLength::ConstraintStringLength(
63 const InheritableAttribute<int>& limit) : limit_(limit) {}
64ConstraintStringLength::ConstraintStringLength(int limit) : limit_(limit) {}
65
66bool ConstraintStringLength::HasOverriddenAttributes() const {
67 return !limit_.is_inherited;
68}
69
70std::unique_ptr<base::Value> ConstraintStringLength::ToJson(
Alex Vakulenko5f472062014-08-14 17:54:04 -070071 chromeos::ErrorPtr* error) const {
Alex Vakulenko66ec2922014-06-17 15:30:22 -070072 return TypedValueToJson(limit_.value, error);
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070073}
74
75// ConstraintStringLengthMin --------------------------------------------------
76ConstraintStringLengthMin::ConstraintStringLengthMin(
77 const InheritableAttribute<int>& limit) : ConstraintStringLength(limit) {}
78ConstraintStringLengthMin::ConstraintStringLengthMin(int limit)
79 : ConstraintStringLength(limit) {}
80
Alex Vakulenko66ec2922014-06-17 15:30:22 -070081bool ConstraintStringLengthMin::Validate(const PropValue& value,
Alex Vakulenko5f472062014-08-14 17:54:04 -070082 chromeos::ErrorPtr* error) const {
Alex Vakulenko66ec2922014-06-17 15:30:22 -070083 CHECK(value.GetString()) << "Expecting a string value for this constraint";
84 const std::string& str = value.GetString()->GetValue();
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070085 int length = static_cast<int>(str.size());
86 if (length < limit_.value) {
87 if (limit_.value == 1) {
Alex Vakulenkoac8037d2014-11-11 11:42:05 -080088 chromeos::Error::AddTo(error, FROM_HERE, errors::commands::kDomain,
Alex Vakulenko5f472062014-08-14 17:54:04 -070089 errors::commands::kOutOfRange,
90 "String must not be empty");
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070091 } else {
Alex Vakulenkoac8037d2014-11-11 11:42:05 -080092 chromeos::Error::AddToPrintf(error, FROM_HERE, errors::commands::kDomain,
Alex Vakulenko5f472062014-08-14 17:54:04 -070093 errors::commands::kOutOfRange,
94 "String must be at least %d characters long,"
95 " actual length of string '%s' is %d",
96 limit_.value, str.c_str(), length);
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070097 }
98 return false;
99 }
100 return true;
101}
102
103std::shared_ptr<Constraint>
104 ConstraintStringLengthMin::CloneAsInherited() const {
105 return std::make_shared<ConstraintStringLengthMin>(limit_.value);
106}
107
108// ConstraintStringLengthMax --------------------------------------------------
109ConstraintStringLengthMax::ConstraintStringLengthMax(
110 const InheritableAttribute<int>& limit) : ConstraintStringLength(limit) {}
111ConstraintStringLengthMax::ConstraintStringLengthMax(int limit)
112 : ConstraintStringLength(limit) {}
113
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700114bool ConstraintStringLengthMax::Validate(const PropValue& value,
Alex Vakulenko5f472062014-08-14 17:54:04 -0700115 chromeos::ErrorPtr* error) const {
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700116 CHECK(value.GetString()) << "Expecting a string value for this constraint";
117 const std::string& str = value.GetString()->GetValue();
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700118 int length = static_cast<int>(str.size());
119 if (length > limit_.value) {
Alex Vakulenkoac8037d2014-11-11 11:42:05 -0800120 chromeos::Error::AddToPrintf(error, FROM_HERE, errors::commands::kDomain,
Alex Vakulenko5f472062014-08-14 17:54:04 -0700121 errors::commands::kOutOfRange,
122 "String must be no more than %d character(s) "
123 "long, actual length of string '%s' is %d",
124 limit_.value, str.c_str(), length);
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700125 return false;
126 }
127 return true;
128}
129
130std::shared_ptr<Constraint>
131 ConstraintStringLengthMax::CloneAsInherited() const {
132 return std::make_shared<ConstraintStringLengthMax>(limit_.value);
133}
134
135} // namespace buffet