(it *lex.ItemIterator, gq *GraphQuery)
| 920 | } |
| 921 | |
| 922 | func parseRecurseArgs(it *lex.ItemIterator, gq *GraphQuery) error { |
| 923 | if ok := trySkipItemTyp(it, itemLeftRound); !ok { |
| 924 | // We don't have a (, we can return. |
| 925 | return nil |
| 926 | } |
| 927 | |
| 928 | var key, val string |
| 929 | var ok bool |
| 930 | for it.Next() { |
| 931 | item := it.Item() |
| 932 | if item.Typ != itemName { |
| 933 | return item.Errorf("Expected key inside @recurse()") |
| 934 | } |
| 935 | key = strings.ToLower(item.Val) |
| 936 | |
| 937 | if ok := trySkipItemTyp(it, itemColon); !ok { |
| 938 | return it.Errorf("Expected colon(:) after %s", key) |
| 939 | } |
| 940 | if !it.Next() { |
| 941 | return it.Errorf("Expected argument") |
| 942 | } |
| 943 | |
| 944 | // Consume the next item. |
| 945 | item = it.Item() |
| 946 | val = item.Val |
| 947 | switch key { |
| 948 | case "depth": |
| 949 | // Check whether the argument is variable or value. |
| 950 | if item.Typ == itemDollar { |
| 951 | // Consume the variable name. |
| 952 | varName, err := parseVarName(it) |
| 953 | if err != nil { |
| 954 | return err |
| 955 | } |
| 956 | if gq.RecurseArgs.varMap == nil { |
| 957 | gq.RecurseArgs.varMap = make(map[string]string) |
| 958 | } |
| 959 | gq.RecurseArgs.varMap["depth"] = varName |
| 960 | } else { |
| 961 | if item.Typ != itemName { |
| 962 | return item.Errorf("Expected value inside @recurse() for key: %s", key) |
| 963 | } |
| 964 | depth, err := strconv.ParseUint(val, 0, 64) |
| 965 | if err != nil { |
| 966 | return errors.New("Value inside depth should be type of integer") |
| 967 | } |
| 968 | gq.RecurseArgs.Depth = depth |
| 969 | } |
| 970 | case "loop": |
| 971 | if item.Typ == itemDollar { |
| 972 | // Consume the variable name. |
| 973 | varName, err := parseVarName(it) |
| 974 | if err != nil { |
| 975 | return err |
| 976 | } |
| 977 | if gq.RecurseArgs.varMap == nil { |
| 978 | gq.RecurseArgs.varMap = make(map[string]string) |
| 979 | } |
no test coverage detected