--- /dev/null
+// -----------------------------------------------------------------------
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// -----------------------------------------------------------------------
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using Microsoft.Internal.Collections;
+using System.ComponentModel.Composition.Hosting;
+
+namespace System.ComponentModel.Composition
+{
+ internal struct CompositionResult
+ {
+ public static readonly CompositionResult SucceededResult = new CompositionResult();
+ private readonly IEnumerable<CompositionError> _errors;
+
+ public CompositionResult(params CompositionError[] errors)
+ : this((IEnumerable<CompositionError>)errors)
+ {
+ }
+
+ public CompositionResult(IEnumerable<CompositionError> errors)
+ {
+ this._errors = errors;
+ }
+
+ public bool Succeeded
+ {
+ get { return this._errors == null || !this._errors.FastAny(); }
+ }
+
+ public IEnumerable<CompositionError> Errors
+ {
+ get { return this._errors ?? Enumerable.Empty<CompositionError>(); }
+ }
+
+ public CompositionResult MergeResult(CompositionResult result)
+ {
+ if (this.Succeeded)
+ {
+ return result;
+ }
+ if (result.Succeeded)
+ {
+ return this;
+ }
+ return MergeErrors(result._errors);
+ }
+
+ public CompositionResult MergeError(CompositionError error)
+ {
+ return MergeErrors(new CompositionError[] { error });
+ }
+
+ public CompositionResult MergeErrors(IEnumerable<CompositionError> errors)
+ {
+ return new CompositionResult(this._errors.ConcatAllowingNull(errors));
+ }
+
+ public CompositionResult<T> ToResult<T>(T value)
+ {
+ return new CompositionResult<T>(value, this._errors);
+ }
+
+ public void ThrowOnErrors()
+ {
+ ThrowOnErrors(null);
+ }
+
+ public void ThrowOnErrors(AtomicComposition atomicComposition)
+ {
+ if (!this.Succeeded)
+ {
+ if (atomicComposition == null)
+ {
+ throw new CompositionException(this._errors);
+ }
+ else
+ {
+ throw new ChangeRejectedException(this._errors);
+ }
+ }
+ }
+ }
+}