tea
1.0.0
データモデリングと検証を備えた vweb のフォーク。
これは概念実証です。
mkdir modules
cd modules
git clone https://github.com/intangere/tea.git
おそらく、Vweb の通常の使用法がすべて当てはまります。
これは、ルート署名の変更を可能にするのに十分な情報を公開する、Vweb 上の単なる薄いラッパーです。
example.v にはたくさんの例があります
簡単な完全な例は次のとおりです。
ユーザーモデルを取り込む/login
ルートを作成しましょう。
まず tea をインポートし、アプリ変数を次のように宣言します。
import tea
struct App {
tea . Context
pub mut:
validators tea . Validators < App >
}
user
モデルを定義します。
struct User {
username string
password string
}
user
モデルが有効であることを確認する関数を定義します。
fn ( user User ) is_valid () bool {
username := user . username . strip_margin ()
password := user . password . strip_margin ()
return username . len > 3 &&
password . len > 8
}
/login
ルートを定義します。
['/ login '; post ]
fn ( mut app App ) login ( user User ) tea. Result {
// posted user parameters will be available in user after being validated
println ('U sername : ' + user . username + ' Password : ' + user . password )
app . json ('{" status ":" testing "}')
}
メイン関数を定義します。
fn main () {
mut app := App {}
}
これで、メイン関数でuser
データ バリデータを作成できます。
(これを名前付き関数として定義することもできます)
login_validator := fn ( mut app App ) {
model := tea . decode_model < User > ( app . req . data )
if ! model . is_valid () {
app. validation_error ('u sername or password too short ')
return
}
app . login ( model )
}
データバリデーターは、ある種のデータ (この場合はリクエストの JSON 本文) を解凍して検証し、結果に応じて検証エラーを返すか、検証されたモデルをルートに渡す必要があります。
ここで、アプリはバリデーターとそれを実行するルートを認識する必要があります。したがって、バリデーターを宣言した後、それをapp.validators
に追加する必要があります。
app . validators . validators ['/ login '] = login_validator
次に、Vweb の場合と同様にアプリを実行するだけです。
tea . run ( & app , 8080 )
/user/:user_id
のような URL パラメータを他のパラメータと組み合わせる場合は、URL パラメータuser_id
他のパラメータの後に置く必要があります。つまり // this will not compile (with or without a validator defined. However it does require one)
['/ user / : user_id ']
fn ( mut app App ) user ( user_id string , user User ) {
}
// this will compile with or without a validator
['/ user / : user_id ']
fn ( mut app App ) user ( user_id string ) {
}
// this will compile with a validator
['/ user / : user_id ']
fn ( mut app App ) user ( user_id int ) {
}
// this is how it has to be defined and will compile (requires a validator defined for /user/:user_id)
['/ user / : user_id ']
fn ( mut app App ) user ( user User , user_id string ) {
}
tea.decode_model<T>(string)
json 文字列を入力として受け取り、それを構造体にデコードします。app.url_params
map[string]string
として適用可能な場合、URL パス パラメーターを公開します。:user_id
パラメータとして受け取らない、それでもアクセスできる検証済みのルートを持つことができます。tea.from_map<T>(map[string]string)
使用すると、app.query を取得し、文字列のみのフィールドを持つ構造体に変換できます。V でコンパイル時のリフレクションがより完全になると、内部のほとんどを隠す次のようなことが可能になるはずです。
import tea
struct App {
tea . Context
pub mut:
validators tea . Validators < App >
}
['/ login '; post ]
fn ( mut app App ) login ( user User ) tea. Result {
// posted user parameters will be available in user after being validated
println ('U sername : ' + user . username + ' Password : ' + user . password )
app . json ('{" status ":" testing "}')
}
['/ login '; validator ]
fn ( mut app App ) login_validator () User {
model := tea . decode_model < User > ( app . req . data )
if ! model . is_valid () {
app. validation_error ('u sername or password too short ')
return
}
return model
}
fn main () {
mut app := App {}
tea . run ( & app , 8080 )
}