Add 4.5 compatible MEF
[mono.git] / mcs / class / System.ComponentModel.Composition.4.5 / src / ComponentModel / System / ComponentModel / Composition / CompositionResult.cs
diff --git a/mcs/class/System.ComponentModel.Composition.4.5/src/ComponentModel/System/ComponentModel/Composition/CompositionResult.cs b/mcs/class/System.ComponentModel.Composition.4.5/src/ComponentModel/System/ComponentModel/Composition/CompositionResult.cs
new file mode 100644 (file)
index 0000000..f8c3c49
--- /dev/null
@@ -0,0 +1,86 @@
+// -----------------------------------------------------------------------
+// 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);
+                }
+            }
+        }
+    }
+}