---
# System prepended metadata

title: Untitled

---

### 問題：

手続きを定義しなさい。引数には `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"]);


```


