Index: pkg/yaml/lib/src/event.dart |
diff --git a/pkg/yaml/lib/src/event.dart b/pkg/yaml/lib/src/event.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..96e2f1666f8ad5bd613afca88d21f9c5f4bcb546 |
--- /dev/null |
+++ b/pkg/yaml/lib/src/event.dart |
@@ -0,0 +1,157 @@ |
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library yaml.event; |
+ |
+import 'package:source_span/source_span.dart'; |
+ |
+import 'style.dart'; |
+import 'yaml_document.dart'; |
+ |
+/// An event emitted by a [Parser]. |
+class Event { |
+ /// The event type. |
+ final EventType type; |
+ |
+ /// The span associated with the event. |
+ final FileSpan span; |
+ |
+ Event(this.type, this.span); |
+ |
+ String toString() => type.toString(); |
+} |
+ |
+/// An event indicating the beginning of a YAML document. |
+class DocumentStartEvent implements Event { |
+ get type => EventType.DOCUMENT_START; |
+ final FileSpan span; |
+ |
+ /// The document's `%YAML` directive, or `null` if there was none. |
+ final VersionDirective versionDirective; |
+ |
+ /// The document's `%TAG` directives, if any. |
+ final List<TagDirective> tagDirectives; |
+ |
+ /// Whether the document started implicitly (that is, without an explicit |
+ /// `===` sequence). |
+ final bool isImplicit; |
+ |
+ DocumentStartEvent(this.span, {this.versionDirective, |
+ List<TagDirective> tagDirectives, this.isImplicit: true}) |
+ : tagDirectives = tagDirectives == null ? [] : tagDirectives; |
+ |
+ String toString() => "DOCUMENT_START"; |
+} |
+ |
+/// An event indicating the end of a YAML document. |
+class DocumentEndEvent implements Event { |
+ get type => EventType.DOCUMENT_END; |
+ final FileSpan span; |
+ |
+ /// Whether the document ended implicitly (that is, without an explicit |
+ /// `...` sequence). |
+ final bool isImplicit; |
+ |
+ DocumentEndEvent(this.span, {this.isImplicit: true}); |
+ |
+ String toString() => "DOCUMENT_END"; |
+} |
+ |
+/// An event indicating that an alias was referenced. |
+class AliasEvent implements Event { |
+ get type => EventType.ALIAS; |
+ final FileSpan span; |
+ |
+ /// The name of the anchor. |
+ final String name; |
+ |
+ AliasEvent(this.span, this.name); |
+ |
+ String toString() => "ALIAS $name"; |
+} |
+ |
+/// A base class for events that can have anchor and tag properties associated |
+/// with them. |
+abstract class _ValueEvent implements Event { |
+ /// The name of the value's anchor, or `null` if it wasn't anchored. |
+ String get anchor; |
+ |
+ /// The text of the value's tag, or `null` if it wasn't tagged. |
+ String get tag; |
+ |
+ String toString() { |
+ var buffer = new StringBuffer('$type'); |
+ if (anchor != null) buffer.write(" &$anchor"); |
+ if (tag != null) buffer.write(" $tag"); |
+ return buffer.toString(); |
+ } |
+} |
+ |
+/// An event indicating a single scalar value. |
+class ScalarEvent extends _ValueEvent { |
+ get type => EventType.SCALAR; |
+ final FileSpan span; |
+ final String anchor; |
+ final String tag; |
+ |
+ /// The contents of the scalar. |
+ final String value; |
+ |
+ /// The style of the scalar in the original source. |
+ final ScalarStyle style; |
+ |
+ ScalarEvent(this.span, this.value, this.style, {this.anchor, this.tag}); |
+ |
+ String toString() => "${super.toString()} \"$value\""; |
+} |
+ |
+/// An event indicating the beginning of a sequence. |
+class SequenceStartEvent extends _ValueEvent { |
+ get type => EventType.SEQUENCE_START; |
+ final FileSpan span; |
+ final String anchor; |
+ final String tag; |
+ |
+ /// The style of the collection in the original source. |
+ final CollectionStyle style; |
+ |
+ SequenceStartEvent(this.span, this.style, {this.anchor, this.tag}); |
+} |
+ |
+/// An event indicating the beginning of a mapping. |
+class MappingStartEvent extends _ValueEvent { |
+ get type => EventType.MAPPING_START; |
+ final FileSpan span; |
+ final String anchor; |
+ final String tag; |
+ |
+ /// The style of the collection in the original source. |
+ final CollectionStyle style; |
+ |
+ MappingStartEvent(this.span, this.style, {this.anchor, this.tag}); |
+} |
+ |
+/// An enum of types of [Event] object. |
+class EventType { |
+ static const STREAM_START = const EventType._("STREAM_START"); |
+ static const STREAM_END = const EventType._("STREAM_END"); |
+ |
+ static const DOCUMENT_START = const EventType._("DOCUMENT_START"); |
+ static const DOCUMENT_END = const EventType._("DOCUMENT_END"); |
+ |
+ static const ALIAS = const EventType._("ALIAS"); |
+ static const SCALAR = const EventType._("SCALAR"); |
+ |
+ static const SEQUENCE_START = const EventType._("SEQUENCE_START"); |
+ static const SEQUENCE_END = const EventType._("SEQUENCE_END"); |
+ |
+ static const MAPPING_START = const EventType._("MAPPING_START"); |
+ static const MAPPING_END = const EventType._("MAPPING_END"); |
+ |
+ final String name; |
+ |
+ const EventType._(this.name); |
+ |
+ String toString() => name; |
+} |