Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавить возможность строгой типизации параметров #2

Open
mantyr opened this issue Mar 26, 2019 · 0 comments

Comments

@mantyr
Copy link
Owner

mantyr commented Mar 26, 2019

Сейчас параметры обозначаются как :name и в параметр входит любое содержимое до символа / или конца строки.

Можно добавить тип параметра, например так:

root.SetString("/user_:id(\d)")      // число от 0 до 9
root.SetString("/user_:id(\d+)")     // число от 0 до бесконечности
root.SetString("/user_:name(\d\s)")  // число + строка, например 1value

О формате в круглых скобках можно подумать отдельно, вплодь до добавления внешних фильтров, удовлетворяющих интерфейсу:

type FilterFunc func(value []byte) bool

type Filter interface {
    Filter(mask []byte) FilteFunc
}

При добавлении ветки в дерево в Param узлах будет сохраняться ссылка на FilterFunc полученная на основе маски в круглых скобках.

Вариант №2

  • передавать в FilterFunc весь адрес начиная с offset и FilterFunc будет возвращать значение параметра, если в строке удалось его найти согласно маски

Пример:

type FilterFunc(path []byte) (value []byte, err error)
root.SetString("/user_:id(filterMask)/123")
root.GetString("/user_123/test")
  • в фильтр попадёт строка 123/test
  • фильтр вернёт значение, либо ошибку
  • по значению можно определить смещение следующего токена

Вариант №3

  • прикрепить к Node скомпилированный regexp если у параметра была маска в круглых скобках
  • учесть что маска должна начинаться с ^ иначе результаты совпадений будут сильно отличаться от разумных (возможно опционально)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant