OLD | NEW |
| (Empty) |
1 // Copyright 2014 Google Inc. All Rights Reserved. | |
2 // | |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
4 // you may not use this file except in compliance with the License. | |
5 // You may obtain a copy of the License at | |
6 // | |
7 // http://www.apache.org/licenses/LICENSE-2.0 | |
8 // | |
9 // Unless required by applicable law or agreed to in writing, software | |
10 // distributed under the License is distributed on an "AS IS" BASIS, | |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 // See the License for the specific language governing permissions and | |
13 // limitations under the License. | |
14 | |
15 /// A simple set of pre/post-condition checkers based on the | |
16 /// [Guava](https://code.google.com/p/guava-libraries/) Preconditions | |
17 /// class in Java. | |
18 /// | |
19 /// These checks are stronger than 'assert' statements, which can be | |
20 /// switched off, so they must only be used in situations where we actively | |
21 /// want the program to break when the check fails. | |
22 /// | |
23 /// ## Performance | |
24 /// Performance may be an issue with these checks if complex logic is computed | |
25 /// in order to make the method call. You should be careful with its use in | |
26 /// these cases - this library is aimed at improving maintainability and | |
27 /// readability rather than performance. They are also useful when the program | |
28 /// should fail early - for example, null-checking a parameter that might not | |
29 /// be used until the end of the method call. | |
30 /// | |
31 /// ## Error messages | |
32 /// The message parameter can be either a `() => Object` or any other `Object`. | |
33 /// The object will be converted to an error message by calling its | |
34 /// `toString()`. The `Function` should be preferred if the message is complex | |
35 /// to construct (i.e., it uses `String` interpolation), because it is only | |
36 /// called when the check fails. | |
37 /// | |
38 /// If the message parameter is `null` or returns `null`, a default error | |
39 /// message will be used. | |
40 library quiver.check; | |
41 | |
42 /// Throws an [ArgumentError] if the given [expression] is `false`. | |
43 void checkArgument(bool expression, {message}) { | |
44 if (!expression) { | |
45 throw new ArgumentError(_resolveMessage(message, null)); | |
46 } | |
47 } | |
48 | |
49 /// Throws a [RangeError] if the given [index] is not a valid index for a list | |
50 /// with [size] elements. Otherwise, returns the [index] parameter. | |
51 int checkListIndex(int index, int size, {message}) { | |
52 if (index < 0 || index >= size) { | |
53 throw new RangeError(_resolveMessage( | |
54 message, 'index $index not valid for list of size $size')); | |
55 } | |
56 return index; | |
57 } | |
58 | |
59 /// Throws an [ArgumentError] if the given [reference] is `null`. Otherwise, | |
60 /// returns the [reference] parameter. | |
61 dynamic checkNotNull(reference, {message}) { | |
62 if (reference == null) { | |
63 throw new ArgumentError(_resolveMessage(message, 'null pointer')); | |
64 } | |
65 return reference; | |
66 } | |
67 | |
68 /// Throws a [StateError] if the given [expression] is `false`. | |
69 void checkState(bool expression, {message}) { | |
70 if (!expression) { | |
71 throw new StateError(_resolveMessage(message, 'failed precondition')); | |
72 } | |
73 } | |
74 | |
75 String _resolveMessage(message, String defaultMessage) { | |
76 if (message is Function) message = message(); | |
77 if (message == null) return defaultMessage; | |
78 return message.toString(); | |
79 } | |
OLD | NEW |