001package org.hl7.fhir.r4.utils;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import org.hl7.fhir.r4.utils.TypesUtilities.TypeClassification;
007import org.hl7.fhir.utilities.Utilities;
008
009
010public class TypesUtilities {
011
012  public enum TypeClassification {
013    PRIMITIVE, DATATYPE, METADATATYPE, SPECIAL;
014
015    public String toDisplay() {
016      switch (this) {
017      case DATATYPE: return "Data Type";
018      case METADATATYPE: return "MetaDataType";
019      case PRIMITIVE: return "Primitive Type";
020      case SPECIAL: return "Special Type";
021      }
022      return "??";
023    }
024  }
025
026  public static class WildcardInformation {
027    private TypeClassification classification;
028    private String typeName;
029    private String comment;
030    public WildcardInformation(String typeName, String comment, TypeClassification classification) {
031      super();
032      this.typeName = typeName;
033      this.comment = comment;
034      this.classification = classification;
035    }
036    public WildcardInformation(String typeName, TypeClassification classification) {
037      super();
038      this.typeName = typeName;
039      this.classification = classification;
040    }
041    public String getTypeName() {
042      return typeName;
043    }
044    public String getComment() {
045      return comment;
046    }
047    public TypeClassification getClassification() {
048      return classification;
049    }
050    
051  }
052  
053  public static List<String> wildcardTypes() {
054    List<String> res = new ArrayList<String>();
055    for (WildcardInformation wi : wildcards())
056      res.add(wi.getTypeName());
057    return res;
058  }
059  
060  // this is the master list for what data types are allowed where the types = *
061  // that this list is incomplete means that the following types cannot have fixed values in a profile:
062  //   Narrative
063  //   Meta
064  //   Any of the IDMP data types
065  // You have to walk into them to profile them.
066  //
067  public static List<WildcardInformation> wildcards() {
068    List<WildcardInformation> res = new ArrayList<WildcardInformation>();
069
070    // primitive types
071    res.add(new WildcardInformation("base64Binary", TypeClassification.PRIMITIVE));
072    res.add(new WildcardInformation("boolean", TypeClassification.PRIMITIVE));
073    res.add(new WildcardInformation("canonical", TypeClassification.PRIMITIVE));
074    res.add(new WildcardInformation("code", "(only if the extension definition provides a <a href=\"terminologies.html#code\">fixed</a> binding to a suitable set of codes)", TypeClassification.PRIMITIVE));
075    res.add(new WildcardInformation("date", TypeClassification.PRIMITIVE));
076    res.add(new WildcardInformation("dateTime", TypeClassification.PRIMITIVE));
077    res.add(new WildcardInformation("decimal", TypeClassification.PRIMITIVE));
078    res.add(new WildcardInformation("id", TypeClassification.PRIMITIVE));
079    res.add(new WildcardInformation("instant", TypeClassification.PRIMITIVE));
080    res.add(new WildcardInformation("integer", TypeClassification.PRIMITIVE));
081    res.add(new WildcardInformation("markdown", TypeClassification.PRIMITIVE));
082    res.add(new WildcardInformation("oid", TypeClassification.PRIMITIVE));
083    res.add(new WildcardInformation("positiveInt", TypeClassification.PRIMITIVE));
084    res.add(new WildcardInformation("string", TypeClassification.PRIMITIVE));
085    res.add(new WildcardInformation("time", TypeClassification.PRIMITIVE));
086    res.add(new WildcardInformation("unsignedInt", TypeClassification.PRIMITIVE));
087    res.add(new WildcardInformation("uri", TypeClassification.PRIMITIVE));
088    res.add(new WildcardInformation("url", TypeClassification.PRIMITIVE));
089    res.add(new WildcardInformation("uuid", TypeClassification.PRIMITIVE));
090
091    // Complex general purpose data types
092    res.add(new WildcardInformation("Address", TypeClassification.DATATYPE));
093    res.add(new WildcardInformation("Age", TypeClassification.DATATYPE));
094    res.add(new WildcardInformation("Annotation", TypeClassification.DATATYPE));
095    res.add(new WildcardInformation("Attachment", TypeClassification.DATATYPE));
096    res.add(new WildcardInformation("CodeableConcept", TypeClassification.DATATYPE));
097    res.add(new WildcardInformation("Coding", TypeClassification.DATATYPE));
098    res.add(new WildcardInformation("ContactPoint", TypeClassification.DATATYPE));
099    res.add(new WildcardInformation("Count", TypeClassification.DATATYPE));
100    res.add(new WildcardInformation("Distance", TypeClassification.DATATYPE));
101    res.add(new WildcardInformation("Duration", TypeClassification.DATATYPE));
102    res.add(new WildcardInformation("HumanName", TypeClassification.DATATYPE));
103    res.add(new WildcardInformation("Identifier", TypeClassification.DATATYPE));
104    res.add(new WildcardInformation("Money", TypeClassification.DATATYPE));
105    res.add(new WildcardInformation("Period", TypeClassification.DATATYPE));
106    res.add(new WildcardInformation("Quantity", TypeClassification.DATATYPE));
107    res.add(new WildcardInformation("Range", TypeClassification.DATATYPE));
108    res.add(new WildcardInformation("Ratio", TypeClassification.DATATYPE));
109    res.add(new WildcardInformation("Reference", " - a reference to another resource", TypeClassification.DATATYPE));
110    res.add(new WildcardInformation("SampledData", TypeClassification.DATATYPE));
111    res.add(new WildcardInformation("Signature", TypeClassification.DATATYPE));
112    res.add(new WildcardInformation("Timing", TypeClassification.DATATYPE));
113    
114    // metadata types
115    res.add(new WildcardInformation("ContactDetail", TypeClassification.METADATATYPE));
116    res.add(new WildcardInformation("Contributor", TypeClassification.METADATATYPE));
117    res.add(new WildcardInformation("DataRequirement", TypeClassification.METADATATYPE));
118    res.add(new WildcardInformation("Expression", TypeClassification.METADATATYPE));
119    res.add(new WildcardInformation("ParameterDefinition", TypeClassification.METADATATYPE));
120    res.add(new WildcardInformation("RelatedArtifact", TypeClassification.METADATATYPE));
121    res.add(new WildcardInformation("TriggerDefinition", TypeClassification.METADATATYPE));
122    res.add(new WildcardInformation("UsageContext", TypeClassification.METADATATYPE));
123    
124    // special cases
125    res.add(new WildcardInformation("Dosage", TypeClassification.SPECIAL));
126    return res;
127  }
128
129  public static boolean isPrimitive(String code) {
130    return Utilities.existsInList(code, "boolean", "integer", "string", "decimal", "uri", "url", "canonical", "base64Binary", "instant", "date", "dateTime", "time", "code", "oid", "id", "markdown", "unsignedInt", "positiveInt", "xhtml");
131  }
132}
133