示例#1
0
        /// <summary>
        /// Create slices on indicated node.
        /// </summary>
        /// <param name="elementNode">Element node containing discriminator</param>
        /// <returns></returns>
        public bool CreateSlice()
        {
            const String fcn = nameof(CreateSlice);

            baseTypeName     = elementNode.FhirType.FriendlyName();
            baseItemTypeName = elementNode.FhirItemType.FriendlyName();

            ElementDefinition.SlicingComponent sliceComponent = elementNode.Element.Slicing;
            if (sliceComponent.Ordered == true)
            {
                this.gen.ConversionError(this.GetType().Name, fcn, $"TODO: Slicing.Ordered == true not currently implemented. '{elementNode.FullPath()}'");
                return(false);
            }

            if (sliceComponent.Rules != ElementDefinition.SlicingRules.Open)
            {
                this.gen.ConversionError(this.GetType().Name, fcn, $"TODO: Slicing.Rules != Open not currently implemented. '{elementNode.FullPath()}'");
                return(false);
            }

            discriminators = sliceComponent.Discriminator.ToArray();
            accessorType   = elementNode.FhirItemType.FriendlyName();
            foreach (ElementDefinitionNode sliceNode in elementNode.Slices)
            {
                CreateSliceAccessorClass(sliceNode, out String sliceClassName, out String sliceInterfaceName);
                CreateSliceAccessor(sliceNode, sliceClassName, sliceInterfaceName);
            }

            return(retVal);
        }
示例#2
0
        public ElementTreeNode SliceValueXByType(ElementTreeSlice slice,
                                                 String[] types)
        {
            ElementDefinition valueX = new ElementDefinition
            {
                Path      = $"{slice.ElementDefinition.Path}.value[x]",
                ElementId = $"{slice.ElementDefinition.ElementId}.value[x]",
                Min       = 1,
                Max       = "1"
            };

            valueX
            .Types(types)
            ;

            ElementDefinition.SlicingComponent slicingComponent = new ElementDefinition.SlicingComponent
            {
                Rules = ElementDefinition.SlicingRules.Closed
            };

            slicingComponent.Discriminator.Add(new ElementDefinition.DiscriminatorComponent
            {
                Type = ElementDefinition.DiscriminatorType.Type,
                Path = "$this"
            });

            valueX.ApplySlicing(slicingComponent, false);

            return(slice.CreateNode(valueX));
        }
        public static ElementDefinition ApplySlicing(this ElementDefinition e,
                                                     ElementDefinition.SlicingComponent slicingComponent,
                                                     bool overrideExistingSliceDiscriminator)
        {
            bool NonCompatible()
            {
                if (e.Slicing == null)
                {
                    return(false);
                }
                if (e.Slicing.Ordered != slicingComponent.Ordered)
                {
                    return(true);
                }
                if (e.Slicing.Rules != slicingComponent.Rules)
                {
                    return(true);
                }
                if (e.Slicing.Discriminator.Count != slicingComponent.Discriminator.Count)
                {
                    return(true);
                }
                for (Int32 i = 0; i < slicingComponent.Discriminator.Count; i++)
                {
                    if (slicingComponent.Discriminator[i].Type != e.Slicing.Discriminator[i].Type)
                    {
                        return(true);
                    }
                    if (slicingComponent.Discriminator[i].Path != e.Slicing.Discriminator[i].Path)
                    {
                        return(true);
                    }
                }

                return(false);
            }

            if (overrideExistingSliceDiscriminator)
            {
                e.Slicing = null;
            }
            if (e.Slicing != null)
            {
                if (NonCompatible() == true)
                {
                    throw new Exception($"Slicing already defined in a noncompatible manner");
                }
            }
            else
            {
                e.Slicing = slicingComponent;
            }
            return(e);
        }
示例#4
0
        internal SliceGroupBucket(ElementDefinition.SlicingComponent slicing, IBucket main, List <IBucket> subs)
        {
            if (slicing == null)
            {
                throw Error.ArgumentNull(nameof(slicing));
            }

            Entry       = main;
            ChildSlices = subs;

            Ordered = slicing.Ordered ?? false;
            Rules   = slicing.Rules ?? ElementDefinition.SlicingRules.Open;
        }
示例#5
0
        public void StartComponentSliceing()
        {
            ElementTreeNode componentNode = this.Get("component");

            ElementDefinition.SlicingComponent slicingComponent = new ElementDefinition.SlicingComponent
            {
                Rules = ElementDefinition.SlicingRules.Open
            };

            slicingComponent.Discriminator.Add(new ElementDefinition.DiscriminatorComponent
            {
                Type = ElementDefinition.DiscriminatorType.Pattern,
                Path = "code"
            });

            componentNode.ApplySlicing(slicingComponent, false);
        }
示例#6
0
        public ElementTreeNode ApplySliceSelf(String path)
        {
            ElementDefinition.SlicingComponent slicing = new ElementDefinition.SlicingComponent
            {
                Rules = ElementDefinition.SlicingRules.Open
            };

            slicing.Discriminator.Add(new ElementDefinition.DiscriminatorComponent
            {
                Type = ElementDefinition.DiscriminatorType.Type,
                Path = "$this"
            });
            ElementTreeNode elementDef = this.Get(path);

            elementDef.ApplySlicing(slicing, false);
            return(elementDef);
        }
示例#7
0
            // Start Section Sliceing
            ElementTreeNode StartSectionSlicing(SDefEditor e)
            {
                ElementTreeNode sectionNode = e.Get("section");

                ElementDefinition.SlicingComponent slicingComponent = new ElementDefinition.SlicingComponent
                {
                    Rules = ElementDefinition.SlicingRules.Open
                };

                slicingComponent.Discriminator.Add(new ElementDefinition.DiscriminatorComponent
                {
                    Type = ElementDefinition.DiscriminatorType.Pattern,
                    Path = "code"
                });

                sectionNode.ApplySlicing(slicingComponent, false);
                return(sectionNode);
            }
示例#8
0
        public ElementTreeNode ConfigureSliceByUrlDiscriminator(ElementTreeNode extDef,
                                                                bool overrideExistingSliceDiscriminator)
        {
            ElementDefinition.SlicingComponent slicingComponent = new ElementDefinition.SlicingComponent
            {
                Ordered = true,
                Rules   = ElementDefinition.SlicingRules.OpenAtEnd
            };

            slicingComponent.Discriminator.Add(new ElementDefinition.DiscriminatorComponent
            {
                Type = ElementDefinition.DiscriminatorType.Value,
                Path = "url"
            });

            extDef.ApplySlicing(slicingComponent, overrideExistingSliceDiscriminator);
            return(extDef);
        }
示例#9
0
 public void ApplySlicing(ElementDefinition.SlicingComponent slicingComponent,
                          bool overrideExistingSliceDiscriminator)
 {
     this.ElementDefinition.ApplySlicing(slicingComponent, overrideExistingSliceDiscriminator);
 }