* Del - Receives existing data structure, path to delete. Returns: `data` - return modified data */ SYS-REQ-010, SYS-REQ-033, SYS-REQ-034, SYS-REQ-035, SYS-REQ-048, SYS-REQ-049, SYS-REQ-050, SYS-REQ-056
(data []byte, keys ...string)
| 735 | */ |
| 736 | // SYS-REQ-010, SYS-REQ-033, SYS-REQ-034, SYS-REQ-035, SYS-REQ-048, SYS-REQ-049, SYS-REQ-050, SYS-REQ-056 |
| 737 | func Delete(data []byte, keys ...string) []byte { |
| 738 | lk := len(keys) |
| 739 | if lk == 0 { |
| 740 | return data[:0] |
| 741 | } |
| 742 | |
| 743 | array := false |
| 744 | if len(keys[lk-1]) > 0 && string(keys[lk-1][0]) == "[" { |
| 745 | array = true |
| 746 | } |
| 747 | |
| 748 | var startOffset, keyOffset int |
| 749 | endOffset := len(data) |
| 750 | var err error |
| 751 | if !array { |
| 752 | if len(keys) > 1 { |
| 753 | _, _, startOffset, endOffset, err = internalGet(data, keys[:lk-1]...) |
| 754 | if err != nil { |
| 755 | // problem parsing the data |
| 756 | return data |
| 757 | } |
| 758 | } |
| 759 | |
| 760 | keyOffset, err = findKeyStart(data[startOffset:endOffset], keys[lk-1]) |
| 761 | if err == KeyPathNotFoundError { |
| 762 | // problem parsing the data |
| 763 | return data |
| 764 | } |
| 765 | keyOffset += startOffset |
| 766 | var subEndOffset int |
| 767 | _, _, _, subEndOffset, err = internalGet(data[startOffset:endOffset], keys[lk-1]) |
| 768 | if err != nil { |
| 769 | return data |
| 770 | } |
| 771 | endOffset = startOffset + subEndOffset |
| 772 | tokEnd := tokenEnd(data[endOffset:]) |
| 773 | tokStart := findTokenStart(data[:keyOffset], ","[0]) |
| 774 | |
| 775 | if endOffset+tokEnd >= len(data) { |
| 776 | // tokenEnd sentinel: no delimiter found, input is truncated |
| 777 | return data |
| 778 | } |
| 779 | |
| 780 | if data[endOffset+tokEnd] == ',' { |
| 781 | endOffset += tokEnd + 1 |
| 782 | } else if data[endOffset+tokEnd] == ' ' && len(data) > endOffset+tokEnd+1 && data[endOffset+tokEnd+1] == ',' { |
| 783 | endOffset += tokEnd + 2 |
| 784 | } else if data[endOffset+tokEnd] == '}' && data[tokStart] == ',' { |
| 785 | keyOffset = tokStart |
| 786 | } |
| 787 | } else { |
| 788 | _, _, keyOffset, endOffset, err = internalGet(data, keys...) |
| 789 | if err != nil { |
| 790 | // problem parsing the data |
| 791 | return data |
| 792 | } |
| 793 | |
| 794 | tokEnd := tokenEnd(data[endOffset:]) |
searching dependent graphs…