| 756 | } |
| 757 | |
| 758 | static struct rune_altern *rune_altern_from_json(const tal_t *ctx, |
| 759 | const char *buffer, |
| 760 | const jsmntok_t *tok) |
| 761 | { |
| 762 | struct rune_altern *alt; |
| 763 | size_t condoff; |
| 764 | /* We still need to unescape here, for \\ -> \. JSON doesn't |
| 765 | * allow unnecessary \ */ |
| 766 | const char *unescape; |
| 767 | struct json_escape *e = json_escape_string_(tmpctx, |
| 768 | buffer + tok->start, |
| 769 | tok->end - tok->start); |
| 770 | unescape = json_escape_unescape(tmpctx, e); |
| 771 | if (!unescape) |
| 772 | return NULL; |
| 773 | |
| 774 | condoff = rune_altern_fieldname_len(unescape, strlen(unescape)); |
| 775 | if (!rune_condition_is_valid(unescape[condoff])) |
| 776 | return NULL; |
| 777 | |
| 778 | alt = tal(ctx, struct rune_altern); |
| 779 | alt->fieldname = tal_strndup(alt, unescape, condoff); |
| 780 | alt->condition = unescape[condoff]; |
| 781 | alt->value = tal_strdup(alt, unescape + condoff + 1); |
| 782 | return alt; |
| 783 | } |
| 784 | |
| 785 | static struct rune_restr *rune_restr_from_json(const tal_t *ctx, |
| 786 | const char *buffer, |
no test coverage detected