blob: 258ff7610c02e5b96198704bd9dd408aee262346 [file] [log] [blame]
// Copyright (c) 2016, 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.
import "dart:async" show Future, Stream;
import "dart:convert" show Encoding;
import "resolve.dart";
import "resource_loader.dart";
/// Base resource implementation.
class Resource {
// Default implementation of a generic `Resource` class.
// Actually exposed `Resource` interfaces uses this as implementation,
// but expose a different `Resource` class with plaform-dependent statics.
// Requires a loader to be provided.
/// Loading strategy for the resource.
final ResourceLoader _loader;
/// The URI of the resource.
final dynamic _uri;
/// Creates a resource object with the given [uri] as location.
/// The [uri] must be either a [Uri] or a [String] containing a valid URI.
/// If the string is not a valid URI, using any of the functions on
/// the resource object will fail.
/// The URI may be relative, in which case it will be resolved
/// against [Uri.base] before being used.
/// The URI may use the `package` scheme,
/// which is supported if the platform can load files at runtime at all.
/// Other schemes may also be supported where possible.
/// If [loader] is provided, it is used to load absolute non-package URIs.
/// Package: URIs are resolved to a non-package URI before being loaded, so
/// the loader doesn't have to support package: URIs, nor does it need to
/// support relative URI references.
/// If [loader] is omitted, a default implementation is used which supports
/// as many of `http`, `https`, `file` and `data` as are available on the
/// current platform.
const Resource(uri, {ResourceLoader loader})
: _uri = uri,
_loader = loader ?? const DefaultLoader();
/// The location URI of this resource.
/// This is a [Uri] of the `uri` parameter given to the constructor.
/// If the parameter was a string that did not contain a valid URI,
/// reading `uri` will fail.
Uri get uri => (_uri is String) ? Uri.parse(_uri) : (_uri as Uri);
/// Reads the resource content as a stream of bytes.
Stream<List<int>> openRead() async* {
var uri = await resolveUri(this.uri);
yield* _loader.openRead(uri);
/// Reads the resource content as a single list of bytes.
Future<List<int>> readAsBytes() async {
var uri = await resolveUri(this.uri);
return _loader.readAsBytes(uri);
/// Reads the resource content as a string.
/// The content is decoded into a string using an [Encoding].
/// If no encoding is provided, an encoding is chosen depending on the
/// protocol and/or available metadata.
Future<String> readAsString({Encoding encoding}) async {
var uri = await resolveUri(this.uri);
return _loader.readAsString(uri, encoding: encoding);