// Copyright (c) 2013, 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. part of "dart:convert"; /// A [Converter] converts data from one representation into another. /// /// The [Converter] class provides a default implementation for every method /// other than [convert]. abstract mixin class Converter implements StreamTransformerBase { const Converter(); /// Adapts [source] to be a `Converter`. /// /// This allows [source] to be used at the new type, but at run-time it /// must satisfy the requirements of both the new type and its original type. /// /// Conversion input must be both [SS] and [TS] and the output created by /// [source] for those input must be both [ST] and [TT]. static Converter castFrom(Converter source) => CastConverter(source); /// Converts [input] and returns the result of the conversion. T convert(S input); /// Fuses `this` with [other]. /// /// Encoding with the resulting converter is equivalent to converting with /// `this` before converting with `other`. Converter fuse(Converter other) { return _FusedConverter(this, other); } /// Starts a chunked conversion. /// /// The returned sink serves as input for the long-running conversion. The /// given [sink] serves as output. Sink startChunkedConversion(Sink sink) { throw UnsupportedError( "This converter does not support chunked conversions: $this", ); } Stream bind(Stream stream) { return Stream.eventTransformed( stream, (EventSink sink) => _ConverterStreamEventSink(this, sink), ); } /// Provides a `Converter` view of this stream transformer. /// /// The resulting transformer will check at run-time that all conversion /// inputs are actually instances of [S], /// and it will check that all conversion output produced by this converter /// are actually instances of [RT]. Converter cast() => Converter.castFrom(this); } /// Fuses two converters. /// /// For a non-chunked conversion converts the input in sequence. class _FusedConverter extends Converter { final Converter _first; final Converter _second; _FusedConverter(this._first, this._second); T convert(S input) => _second.convert(_first.convert(input)); Sink startChunkedConversion(Sink sink) { return _first.startChunkedConversion(_second.startChunkedConversion(sink)); } }