Skip to content

Commit

Permalink
Merge pull request #2811 from FirelyTeam/no-more-exceptions
Browse files Browse the repository at this point in the history
Integrating generated code for Base, DataType, PrimitiveType and Extension
  • Loading branch information
mmsmits authored Jul 18, 2024
2 parents f28eaba + 5b9b1e7 commit 6544788
Show file tree
Hide file tree
Showing 9 changed files with 447 additions and 278 deletions.
61 changes: 2 additions & 59 deletions src/Hl7.Fhir.Base/Model/Base.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,37 +40,9 @@ POSSIBILITY OF SUCH DAMAGE.

namespace Hl7.Fhir.Model
{
[Serializable]
[FhirType("Base", "http://hl7.org/fhir/StructureDefinition/Base")]
[DataContract]
public abstract class Base : IDeepCopyable, IDeepComparable,
public abstract partial class Base : IDeepCopyable, IDeepComparable,
IAnnotated, IAnnotatable, IValidatableObject, INotifyPropertyChanged, IReadOnlyDictionary<string, object>
{
public virtual bool IsExactly(IDeepComparable other) => other is Base;

public virtual bool Matches(IDeepComparable other) => other is Base;

/// <summary>
///
/// </summary>
/// <param name="other"></param>
/// <remarks>Does a deep-copy of all elements, except UserData</remarks>
/// <returns></returns>
public virtual IDeepCopyable CopyTo(IDeepCopyable other)
{
if (other is Base dest)
{
if (_annotations is not null)
dest.annotations.AddRange(annotations);

return dest;
}
else
throw new ArgumentException("Can only copy to an object of the same type", nameof(other));
}

public abstract IDeepCopyable DeepCopy();

public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext) => Enumerable.Empty<ValidationResult>();

#region << Annotations >>
Expand All @@ -95,27 +67,6 @@ protected virtual void OnPropertyChanged(String property) =>

#endregion

public virtual string TypeName => "Base";

/// <summary>
/// Enumerate all child nodes.
/// Return a sequence of child elements, components and/or properties.
/// Child nodes are returned in the order defined by the FHIR specification.
/// First returns child nodes inherited from any base class(es), recursively.
/// Finally returns child nodes defined by the current class.
/// </summary>
public virtual IEnumerable<Base> Children { get { return Enumerable.Empty<Base>(); } }

/// <summary>
/// Enumerate all child nodes.
/// Return a sequence of child elements, components and/or properties.
/// Child nodes are returned as tuples with the name and the node itself, in the order defined
/// by the FHIR specification.
/// First returns child nodes inherited from any base class(es), recursively.
/// Finally returns child nodes defined by the current class.
/// </summary>
public virtual IEnumerable<ElementValue> NamedChildren => Enumerable.Empty<ElementValue>();

public IReadOnlyDictionary<string, object> AsReadOnlyDictionary() => this;

#region IReadOnlyDictionary
Expand All @@ -135,13 +86,5 @@ protected virtual void OnPropertyChanged(String property) =>

bool IReadOnlyDictionary<string, object>.TryGetValue(string key, out object value) => TryGetValue(key, out value);
#endregion

protected virtual bool TryGetValue(string key, out object value)
{
value = default;
return false;
}

protected virtual IEnumerable<KeyValuePair<string, object>> GetElementPairs() => Enumerable.Empty<KeyValuePair<string, object>>();
}
}
}
150 changes: 15 additions & 135 deletions src/Hl7.Fhir.Base/Model/Extension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,142 +40,22 @@ POSSIBILITY OF SUCH DAMAGE.
using System.Runtime.Serialization;
using SystemPrimitive = Hl7.Fhir.ElementModel.Types;

namespace Hl7.Fhir.Model
namespace Hl7.Fhir.Model;

/// <summary>
/// Optional Extensions Element
/// </summary>
[System.Diagnostics.DebuggerDisplay(@"\{Value={Value} Url={_url}}")]
[Bindable(true)]
public partial class Extension
{
/// <summary>
/// Optional Extensions Element
/// </summary>
[Serializable]
[System.Diagnostics.DebuggerDisplay(@"\{Value={Value} Url={_url}}")]
[FhirType("Extension", "http://hl7.org/fhir/StructureDefinition/Extension")]
[DataContract]
[Bindable(true)]
public class Extension : DataType
public Extension()
{
public Extension()
{
}

public Extension(string url, DataType value)
{
this.Url = url;
this.Value = value;
}

public override string TypeName { get { return "Extension"; } }

/// <summary>
/// identifies the meaning of the extension
/// </summary>
[FhirElement("url", XmlSerialization = XmlRepresentation.XmlAttr, InSummary = true, Order = 30)]
[DeclaredType(Type = typeof(SystemPrimitive.String))]
[Cardinality(Min = 1, Max = 1)]
[UriPattern]
[DataMember]
public string? Url
{
get { return _url; }
set { _url = value; OnPropertyChanged("Url"); }
}

private string? _url;

/// <summary>
/// Value of extension
/// </summary>
[FhirElement("value", InSummary = true, Order = 40, Choice = ChoiceType.DatatypeChoice)]
[DataMember]
public DataType? Value
{
get { return _value; }
set { _value = value; OnPropertyChanged("Value"); }
}

private DataType? _value;

public override IDeepCopyable CopyTo(IDeepCopyable other)
{
if (other is Extension dest)
{
base.CopyTo(dest);
if (Url != null) dest.Url = Url;
if (Value != null) dest.Value = (Hl7.Fhir.Model.DataType)Value.DeepCopy();
return dest;
}
else
throw new ArgumentException("Can only copy to an object of the same type", nameof(other));
}

public override IDeepCopyable DeepCopy()
{
return CopyTo(new Extension());
}

public override bool Matches(IDeepComparable other)
{
var otherT = other as Extension;
if (otherT == null) return false;

if (!base.Matches(otherT)) return false;
if (Url != otherT.Url) return false;
if (!DeepComparable.Matches(Value, otherT.Value)) return false;

return true;
}

public override bool IsExactly(IDeepComparable other)
{
var otherT = other as Extension;
if (otherT == null) return false;

if (!base.IsExactly(otherT)) return false;
if (Url != otherT.Url) return false;
if (!DeepComparable.IsExactly(Value, otherT.Value)) return false;

return true;
}

public override IEnumerable<Base> Children
{
get
{
foreach (var item in base.Children) yield return item;
if (Url != null) yield return new FhirUri(Url);
if (Value != null) yield return Value;
}
}

public override IEnumerable<ElementValue> NamedChildren
{
get
{
// Extension elements
foreach (var item in base.NamedChildren) yield return item;
if (Url != null) yield return new ElementValue("url", new FhirUri(Url));
if (Value != null) yield return new ElementValue("value", Value);
}
}

protected override bool TryGetValue(string key, [NotNullWhen(true)]out object? value)
{
switch (key)
{
case "url":
value = Url;
return Url is not null;
case "value":
value = Value;
return Value is not null;
default:
return base.TryGetValue(key, out value);
}
}
}

protected override IEnumerable<KeyValuePair<string, object>> GetElementPairs()
{
if (Url is not null) yield return new KeyValuePair<string, object>("url", Url);
if (Value is not null) yield return new KeyValuePair<string, object>("value", Value);
foreach (var kvp in base.GetElementPairs()) yield return kvp;
}
public Extension(string url, DataType value)
{
this.Url = url;
this.Value = value;
}
}
}
118 changes: 118 additions & 0 deletions src/Hl7.Fhir.Base/Model/Generated/Base.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
// <auto-generated/>
// Contents of: hl7.fhir.r5.expansions#5.0.0, hl7.fhir.r5.core#5.0.0

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using Hl7.Fhir.Introspection;
using Hl7.Fhir.Serialization;
using Hl7.Fhir.Specification;
using Hl7.Fhir.Utility;
using Hl7.Fhir.Validation;
using SystemPrimitive = Hl7.Fhir.ElementModel.Types;

/*
Copyright (c) 2011+, HL7, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of HL7 nor the names of its contributors may be used to
endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/

namespace Hl7.Fhir.Model
{
/// <summary>
/// Base for all types and resources
/// </summary>
/// <remarks>
/// Base definition for all types defined in FHIR type system.
/// </remarks>
[Serializable]
[DataContract]
[FhirType("Base","http://hl7.org/fhir/StructureDefinition/Base")]
public abstract partial class Base
{
/// <summary>
/// FHIR Type Name
/// </summary>
public virtual string TypeName { get { return "Base"; } }

public virtual IDeepCopyable CopyTo(IDeepCopyable other)
{
var dest = other as Base;

if (dest == null)
{
throw new ArgumentException("Can only copy to an object of the same type", "other");
}

if (_annotations is not null)
dest.annotations.AddRange(annotations);

return dest;
}

public virtual IDeepCopyable DeepCopy() =>
CopyTo((IDeepCopyable)Activator.CreateInstance(GetType())!);

///<inheritdoc />
public virtual bool Matches(IDeepComparable other) => other is Base;

public virtual bool IsExactly(IDeepComparable other) => other is Base;

/// <summary>
/// Enumerate all child nodes.
/// Return a sequence of child elements, components and/or properties.
/// Child nodes are returned in the order defined by the FHIR specification.
/// First returns child nodes inherited from any base class(es), recursively.
/// Finally returns child nodes defined by the current class.
/// </summary>
[IgnoreDataMember]
public virtual IEnumerable<Base> Children => Enumerable.Empty<Base>();

/// <summary>
/// Enumerate all child nodes.
/// Return a sequence of child elements, components and/or properties.
/// Child nodes are returned as tuples with the name and the node itself, in the order defined
/// by the FHIR specification.
/// First returns child nodes inherited from any base class(es), recursively.
/// Finally returns child nodes defined by the current class.
/// </summary>
[IgnoreDataMember]
public virtual IEnumerable<ElementValue> NamedChildren => Enumerable.Empty<ElementValue>();

protected virtual bool TryGetValue(string key, out object value)
{
value = default;
return false;
}

protected virtual IEnumerable<KeyValuePair<string, object>> GetElementPairs() => Enumerable.Empty<KeyValuePair<string, object>>();

}

}

// end of file
18 changes: 0 additions & 18 deletions src/Hl7.Fhir.Base/Model/Generated/DataType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,24 +93,6 @@ public override bool IsExactly(IDeepComparable other)
return true;
}

[IgnoreDataMember]
public override IEnumerable<Base> Children
{
get
{
foreach (var item in base.Children) yield return item;
}
}

[IgnoreDataMember]
public override IEnumerable<ElementValue> NamedChildren
{
get
{
foreach (var item in base.NamedChildren) yield return item;
}
}

}

}
Expand Down
Loading

0 comments on commit 6544788

Please sign in to comment.