### 問題:
手続きを定義しなさい。引数には `method`と`path`を受け取る。
`method` は `GET`, `POST`, `HEAD`, `PUT`などの文字列である。
path は `/` から始まる任意の文字列である。 (`"/"` だけの場合もありうる)
返り値は `[status, contents]` からなるリスト/配列とする。
`status`は`"200 OK"`, `"404 NotFound"`などの文字列である。
`contents`は、method, path の関係ごとに紐付けられた文字列である
以下の要件を満たすように実装せよ。
```
GET "/hello" → ("200 OK", "こんにちは")
GET "/bye" → ("200 OK", "さよなら")
POST "/bye" → ("200 OK", "ばいばい")
PUT "/bye" → ("200 OK", "Good bye")
該当なし → ("404 NotFound", "ないです")
POST "/hello" → ("405 NotAllowed, "だめです")
```
処理とデータは可能な限り分離せよ。
`if (path == "/hello") 〜 elseif (path == "/bye")`のように、条件文にマジックナンバーが含まれるコードは望ましくない。
### 回答
```javascript=
const make_server = (routes, not_found, not_allowed) => {
return (method, path) => {
if (routes[path]) {
if (routes[path][method]) {
return routes[path][method];
}
return not_allowed;
}
return not_found;
}
}
const server1 = make_server({
"/hello": {
"GET": ["200 OK", "こんにちは"]
},
"/bye": {
"GET": ["200 OK", "さよなら"],
"POST": ["200 OK", "ばいばい"],
"PUT": ["200 OK", "Good bye"],
}
}, ["404 NotFound", "ないです"], ["405 NotAllowed", "だめです"]);
const server2 = make_server({
"/hello": {
"GET": ["200 OK", "Hello"]
},
"/bye": {
"GET": ["200 OK", "Good bye"],
"POST": ["200 OK", "bye bye"],
"PUT": ["200 OK", "Good bye"],
}
}, ["404 NotFound", "Not Found"], ["405 NotAllowed", "Not Allowed"]);
```