public void GetCode(StringBuilder builder, FigmaCodeNode node, FigmaCodeNode parent = null, FigmaCodeRendererServiceOptions currentRendererOptions = null)
        {
            //in first level we clear all identifiers
            if (parent == null)
            {
                if (MainNode == null)
                {
                    //clear all nodes
                    Nodes.Clear();

                    identifiers.Clear();
                    OnStartGetCode();

                    //we initialize
                    CurrentRendererOptions = currentRendererOptions ?? new FigmaCodeRendererServiceOptions();

                    //we store our main node
                    MainNode       = node;
                    ParentMainNode = parent;
                }
            }

            if (node != null)
            {
                Nodes.Add(node);
            }

            FigmaCodeNode      calculatedParentNode = null;
            FigmaViewConverter converter            = null;

            var isNodeSkipped = IsNodeSkipped(node);

            //on node skipped we don't render
            if (!isNodeSkipped)
            {
                //if (figmaProvider.RendersProperties (node)) {
                converter = GetConverter(node, customConverters);
                //bool navigateChild = true;
                if (converter == null)
                {
                    converter = GetConverter(node, figmaConverters);
                }

                if (converter != null)
                {
                    if (!node.HasName)
                    {
                        if (!TryGetCodeViewName(node, parent, converter, out string identifier))
                        {
                            identifier = DefaultViewName;
                        }

                        //we store our name to don't generate dupplicates
                        var lastIndex = GetLastInsertedIndex(identifier);
                        if (lastIndex >= 0)
                        {
                            identifiers.Remove(identifier);
                        }
                        lastIndex++;

                        node.Name = identifier;
                        if (lastIndex > 0)
                        {
                            node.Name += lastIndex;
                        }
                        identifiers.Add(identifier, lastIndex);
                    }

                    builder.AppendLine();
                    builder.AppendLine($"// View:     {node.Name}");
                    builder.AppendLine($"// NodeName: {node.Node.name}");
                    builder.AppendLine($"// NodeType: {node.Node.type}");
                    builder.AppendLine($"// NodeId:   {node.Node.id}");

                    OnPreConvertToCode(builder, node, parent, converter, codePropertyConverter);
                    //we generate our code and replace node name

                    var code = converter.ConvertToCode(node, parent, this);
                    builder.AppendLineIfValue(code.Replace(Resources.Ids.Conversion.NameIdentifier, node.Name));
                    OnPostConvertToCode(builder, node, parent, converter, codePropertyConverter);


                    if (RendersAddChild(node, parent, this))
                    {
                        builder.AppendLineIfValue(codePropertyConverter.ConvertToCode(CodeProperties.AddChild, node, parent, this));
                        OnChildAdded(builder, node, parent, converter, codePropertyConverter);
                    }

                    if (RendersSize(node, parent, this))
                    {
                        builder.AppendLineIfValue(codePropertyConverter.ConvertToCode(CodeProperties.Frame, node, parent, this));
                        OnFrameSet(builder, node, parent, converter, codePropertyConverter);
                    }

                    if (RendersConstraints(node, parent, this))
                    {
                        builder.AppendLineIfValue(codePropertyConverter.ConvertToCode(CodeProperties.Constraints, node, parent, this));
                    }

                    calculatedParentNode = node;
                }
                else
                {
                    //without a converter we don't have any view created, we need to attach to the parent view
                    calculatedParentNode = parent;
                }
            }

            //without converter we scan the children automatically
            var navigateChild = converter?.ScanChildren(node.Node) ?? true;

            if (navigateChild && HasChildrenToRender(node))
            {
                foreach (var item in GetChildrenToRender(node))
                {
                    var figmaNode = new FigmaCodeNode(item, parent: node);
                    GetCode(builder, figmaNode, calculatedParentNode);
                }
            }

            if (MainNode == node)
            {
                //first loop
                Clear();
            }
        }