blob: 39afdae25b330eda735f39ca0b77e9bb0773018c [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import '../schema/base_type.dart';
import '../sledge_connection_id.dart';
import 'leaf_value.dart';
import 'value.dart';
/// Class that maps field names to values.
/// See the documentation for the `Value` class for a description
/// of its role.
class NodeValue implements Value {
Map<String, Value> _childValues;
/// Default constructor. [schemaDescription] specifies the name and type of
/// every field.
NodeValue(
Map<String, BaseType> schemaDescription, ConnectionId connectionId) {
_childValues = <String, Value>{};
schemaDescription.forEach((String name, BaseType type) {
Value value = type.newValue(connectionId);
assert(value != null);
_childValues[name] = value;
});
}
/// Returns a Map from field name to value.
Map<String, LeafValue> collectFields() {
final fields = <String, LeafValue>{};
_childValues.forEach((String name, Value value) {
if (value is NodeValue) {
value
.collectFields()
.forEach((key, value) => fields['$name.$key'] = value);
} else {
assert(value is LeafValue);
fields[name] = value;
}
});
return fields;
}
/// Returns the child Value associated with [fieldName].
/// If [fieldName] does not have any associated Value, an ArgumentError
/// exception is thrown.
dynamic operator [](String fieldName) {
Value value = _childValues[fieldName];
if (value == null) {
throw ArgumentError('Field `$fieldName` does not exist.');
}
return value;
}
}