Ejemplo n.º 1
0
        /// <summary>Writes a value set.</summary>
        /// <param name="valueSet">Set the value belongs to.</param>
        private void WriteValueSet(
            FhirValueSet valueSet)
        {
            _writer.WriteLineIndented(
                $"- {valueSet.URL}|{valueSet.Version}" +
                $" ({valueSet.Name})" +
                $" {valueSet.ReferencedByPaths.Count} references," +
                $" strongest: {valueSet.StrongestBinding}");

            _writer.IncreaseIndent();

            foreach (FhirConcept concept in valueSet.Concepts.OrderBy(c => c.Code))
            {
                _writer.WriteLineIndented($"- #{concept.Code}: {concept.Display}");
            }

            _writer.DecreaseIndent();
        }
Ejemplo n.º 2
0
        /// <summary>Writes a value set.</summary>
        /// <param name="vs">The value set.</param>
        private void WriteValueSet(
            FhirValueSet vs)
        {
            string vsName = FhirUtils.SanitizeForProperty(vs.Id ?? vs.Name, _reservedWords);

            vsName = FhirUtils.SanitizedToConvention(vsName, FhirTypeBase.NamingConvention.PascalCase);

            if (!string.IsNullOrEmpty(vs.Description))
            {
                WriteIndentedComment(vs.Description);
            }
            else
            {
                WriteIndentedComment($"Value Set: {vs.URL}|{vs.Version}");
            }

            if (vsName.EndsWith("ValueSet", StringComparison.Ordinal))
            {
                _writer.WriteLineIndented($"public static class {vsName}");
            }
            else
            {
                _writer.WriteLineIndented($"public static class {vsName}ValueSet");
            }

            _writer.WriteLineIndented("{");
            _writer.IncreaseIndent();

            bool             prefixWithSystem = vs.ReferencedCodeSystems.Count > 1;
            HashSet <string> usedValues       = new HashSet <string>();

            foreach (FhirConcept concept in vs.Concepts.OrderBy(c => c.Code))
            {
                string input = concept.Display;
                if (_systemsNamedByDisplay.Contains(concept.System))
                {
                    input = concept.Display;
                }
                else if (_systemsNamedByCode.Contains(concept.System))
                {
                    input = concept.Code;
                }
                else if (string.IsNullOrEmpty(input))
                {
                    input = concept.Code;
                }

                string codeName  = FhirUtils.SanitizeForProperty(input, _reservedWords);
                string codeValue = FhirUtils.SanitizeForValue(concept.Code);

                codeName = FhirUtils.SanitizedToConvention(codeName, FhirTypeBase.NamingConvention.PascalCase);

                string name;

                if (prefixWithSystem)
                {
                    name = $"{codeName}_{concept.SystemLocalName}";
                }
                else
                {
                    name = codeName;
                }

                if (usedValues.Contains(name))
                {
                    // start at 2 so that the unadorned version makes sense as v1
                    for (int i = 2; i < 1000; i++)
                    {
                        if (usedValues.Contains($"{name}_{i}"))
                        {
                            continue;
                        }

                        name = $"{name}_{i}";
                        break;
                    }
                }

                usedValues.Add(name);

                if (_namesRequiringKeywordNew.Contains(name))
                {
                    _writer.WriteLineIndented($"public static readonly new Coding {name} = new Coding");
                }
                else
                {
                    _writer.WriteLineIndented($"public static readonly Coding {name} = new Coding");
                }

                _writer.WriteLineIndented("{");
                _writer.IncreaseIndent();

                _writer.WriteLineIndented($"Code = \"{codeValue}\",");

                if (!string.IsNullOrEmpty(concept.Display))
                {
                    _writer.WriteLineIndented($"Display = \"{FhirUtils.SanitizeForQuoted(concept.Display)}\",");
                }

                _writer.WriteLineIndented($"System = \"{concept.System}\"");

                _writer.DecreaseIndent();
                _writer.WriteLineIndented("};");
            }

            _writer.DecreaseIndent();
            _writer.WriteLineIndented("};");
        }
Ejemplo n.º 3
0
        /// <summary>Writes a value set.</summary>
        /// <param name="vs">                  The value set.</param>
        /// <param name="writtenCodesAndNames">[in,out] The written codes, to prevent duplication
        ///  without writing all code systems.</param>
        /// <param name="writtenNames">        [in,out] List of names of the writtens.</param>
        private void WriteValueSet(
            FhirValueSet vs,
            ref Dictionary <string, WrittenCodeInfo> writtenCodesAndNames,
            ref HashSet <string> writtenNames)
        {
            string vsName = FhirUtils.SanitizeForProperty(vs.Id ?? vs.Name, _reservedWords);

            vsName = FhirUtils.SanitizedToConvention(vsName, FhirTypeBase.NamingConvention.PascalCase);

            foreach (FhirConcept concept in vs.Concepts.OrderBy(c => c.Code))
            {
                if (writtenCodesAndNames.ContainsKey(concept.Key()))
                {
                    continue;
                }

                string input = concept.Display;
                if (_systemsNamedByDisplay.Contains(concept.System))
                {
                    input = concept.Display;
                }
                else if (_systemsNamedByCode.Contains(concept.System))
                {
                    input = concept.Code;
                }
                else if (string.IsNullOrEmpty(input))
                {
                    input = concept.Code;
                }

                string codeName  = FhirUtils.SanitizeForProperty(input, _reservedWords);
                string codeValue = FhirUtils.SanitizeForValue(concept.Code);

                codeName = FhirUtils.SanitizedToConvention(codeName, FhirTypeBase.NamingConvention.PascalCase);

                string constName;
                if (!string.IsNullOrEmpty(concept.SystemLocalName))
                {
                    constName = $"{concept.SystemLocalName}_{codeName}";
                }
                else
                {
                    constName = $"{vsName}_{codeName}";
                }

                if (writtenNames.Contains(constName))
                {
                    // start at 2 so that the unadorned version makes sense as v1
                    for (int i = 2; i < 1000; i++)
                    {
                        if (writtenNames.Contains($"{constName}_{i}"))
                        {
                            continue;
                        }

                        constName = $"{constName}_{i}";
                        break;
                    }
                }

                writtenCodesAndNames.Add(
                    concept.Key(),
                    new WrittenCodeInfo()
                {
                    Name = codeName, ConstName = constName
                });
                writtenNames.Add(constName);

                _writer.WriteLineIndented($"const {constName}: Coding = {{");
                _writer.IncreaseIndent();

                _writer.WriteLineIndented($"code: \"{codeValue}\",");

                if (!string.IsNullOrEmpty(concept.Display))
                {
                    _writer.WriteLineIndented($"display: \"{FhirUtils.SanitizeForQuoted(concept.Display)}\",");
                }

                _writer.WriteLineIndented($"system: \"{concept.System}\"");

                _writer.DecreaseIndent();

                _writer.WriteLineIndented("};");
            }

            if (!string.IsNullOrEmpty(vs.Description))
            {
                WriteIndentedComment(vs.Description);
            }
            else
            {
                WriteIndentedComment($"Value Set: {vs.URL}|{vs.Version}");
            }

            _writer.WriteLineIndented($"export const {vsName} = {{");
            _writer.IncreaseIndent();

            bool             prefixWithSystem = vs.ReferencedCodeSystems.Count > 1;
            HashSet <string> usedValues       = new HashSet <string>();

            // TODO: shouldn't loop over this twice, but writer functions don't allow writing in two places at once yet
            foreach (FhirConcept concept in vs.Concepts.OrderBy(c => c.Code))
            {
                string codeKey = concept.Key();

                if (!string.IsNullOrEmpty(concept.Definition))
                {
                    WriteIndentedComment(concept.Definition);
                }

                string name;

                if (prefixWithSystem)
                {
                    name = $"{writtenCodesAndNames[codeKey].Name}_{concept.SystemLocalName}";
                }
                else
                {
                    name = writtenCodesAndNames[codeKey].Name;
                }

                if (usedValues.Contains(name))
                {
                    // start at 2 so that the unadorned version makes sense as v1
                    for (int i = 2; i < 1000; i++)
                    {
                        if (usedValues.Contains($"{name}_{i}"))
                        {
                            continue;
                        }

                        name = $"{name}_{i}";
                        break;
                    }
                }

                usedValues.Add(name);

                _writer.WriteLineIndented($"{name}: {writtenCodesAndNames[codeKey].ConstName},");
            }

            _writer.DecreaseIndent();

            _writer.WriteLineIndented("};");
        }