bool ILanguangeExporter.AppendCodes(
            ref StringBuilder sb,
            FhirProperty property,
            string parentName
            )
        {
            // **** put a comment ****

            sb.Append($"/**\n * Code Values for the {parentName}.{property.Name} field\n */\n");

            // **** open our enum ***

            sb.Append($"export enum {parentName}{property.NameCapitalized}Codes {{\n");

            // **** start adding values ****

            foreach (string code in property.CodeValues)
            {
                FhirTypeManager.SanitizeForCode(code, _reservedWordsSet, out string name, out string value);

                sb.Append($"\t{name.ToUpper()} = \"{value}\",\n");
            }

            // **** close our enum ***

            sb.Append("}\n");

            return(true);
        }
        bool ILanguangeExporter.AppendCodes(
            ref StringBuilder sb,
            FhirProperty property,
            string parentName
            )
        {
            // **** put a comment ****

            sb.Append($"\t///<summary>Code Values for the {parentName}.{property.Name} field</summary>\n");

            // **** open our enum ***

            sb.Append($"\tpublic sealed class {parentName}{property.NameCapitalized}Codes {{\n");

            // **** start adding values ****

            foreach (string code in property.CodeValues)
            {
                FhirTypeManager.SanitizeForCode(code, _reservedWordsSet, out string name, out string value);

                sb.Append($"\t\tpublic const string {name.ToUpper()} = \"{value}\";\n");
            }

            // **** close our enum ***

            sb.Append("\t}\n");

            return(true);
        }
        bool ILanguangeExporter.AppendFhirProperty(
            ref StringBuilder sb,
            FhirProperty property,
            string typeName,
            bool useLowerCaseName
            )
        {
            // **** always use lower-case start ****

            string name = FhirTypeManager.SanitizeForProperty(property.Name, _reservedWordsSet);

            string comment = FhirTypeManager.SanitizeComment(property.Comment, _lineComment, _indentChar, 2);

            string optionalFlagString = (_flagOptionals && property.IsOptional) ? "?" : "";

            // **** ****

            if (property.IsArray)
            {
                sb.Append(
                    $"\t/**\n" +
                    $"\t * {comment}\n" +
                    //$"\t * Cardinality: {property.Cardinality}\n" +
                    $"\t */\n" +
                    $"\t{name}{optionalFlagString}: {typeName}[];\n" +
                    $"\t/**\n" +
                    $"\t * May contain extended information for property: '{name}'\n" +
                    $"\t */\n" +
                    $"\t_{name}?: Element[];\n"
                    );

                return(true);
            }

            sb.Append(
                $"\t/**\n" +
                $"\t * {comment}\n" +
                //$"\t * Cardinality: {property.Cardinality}\n" +
                $"\t */\n" +
                $"\t{name}{optionalFlagString}: {typeName};\n" +
                $"\t/**\n" +
                $"\t * May contain extended information for property: '{name}'\n" +
                $"\t */\n" +
                $"\t_{name}?: Element;\n"
                );

            return(true);
        }
        bool ILanguangeExporter.AppendFhirProperty(
            ref StringBuilder sb,
            FhirProperty property,
            string typeName,
            bool useLowerCaseName
            )
        {
            string nameCamel  = FhirTypeManager.SanitizeForProperty(property.Name, _reservedWordsSet);
            string namePascal = FhirTypeManager.SanitizeForProperty(property.NameCapitalized, _reservedWordsSet);

            string propertyName;
            string extendedName;

            if (useLowerCaseName)
            {
                propertyName = nameCamel;
                extendedName = nameCamel;
            }
            else
            {
                switch (LanguageStyle)
                {
                case (int)CSharpStyle.SystemTextJson:
                    propertyName = namePascal;
                    extendedName = namePascal;
                    break;

                case (int)CSharpStyle.Newtonsoft:
                    propertyName = namePascal;
                    extendedName = namePascal;
                    break;

                case (int)CSharpStyle.Plain:
                default:
                    propertyName = namePascal;
                    extendedName = nameCamel;
                    break;
                }
            }

            string propertyAnnotation = "";
            string extendedAnnotation = "";

            switch (LanguageStyle)
            {
            case (int)CSharpStyle.SystemTextJson:
                propertyAnnotation = $"\t\t[JsonPropertyName(\"{property.Name}\")]\n";
                extendedAnnotation = $"\t\t[JsonPropertyName(\"_{property.Name}\")]\n";
                break;

            case (int)CSharpStyle.Newtonsoft:
                propertyAnnotation = $"\t\t[JsonProperty(PropertyName = \"{property.Name}\")]\n";
                extendedAnnotation = $"\t\t[JsonProperty(PropertyName = \"_{property.Name}\")]\n";
                break;

            case (int)CSharpStyle.Plain:
            default:

                break;
            }

            string comment = FhirTypeManager.SanitizeComment(property.Comment, _lineComment, _indentChar, 2);

            string optionalFlagString = (_flagOptionals && property.IsOptional) ? "?" : "";

            // **** nullable reference types are not allowed in current C# ****

            switch (typeName)
            {
            case "bool":
            case "decimal":
            case "DateTime":
            case "int":
            case "uint":
            case "Guid":

                // **** ignore - types can be optional ****
                break;

            default:
                // **** do not allow reference types to be null (for now) ****
                optionalFlagString = "";
                break;
            }

            // **** ****

            if (property.IsArray)
            {
                sb.Append(
                    $"\t\t///<summary>{comment}</summary>\n" +
                    propertyAnnotation +
                    $"\t\tpublic {typeName}[] {propertyName} {{ get; set; }}\n" +
                    $"\t\t///<summary>May contain extended information for property: '{propertyName}'</summary>\n" +
                    extendedAnnotation +
                    $"\t\tpublic Element[] _{extendedName} {{ get; set; }}\n");

                return(true);
            }

            sb.Append(
                $"\t\t///<summary>{comment}</summary>\n" +
                propertyAnnotation +
                $"\t\tpublic {typeName}{optionalFlagString} {propertyName} {{ get; set; }}\n" +
                $"\t\t///<summary>May contain extended information for property: '{propertyName}'</summary>\n" +
                extendedAnnotation +
                $"\t\tpublic Element _{extendedName} {{ get; set; }}\n");

            return(true);
        }