Cookpad の非公式 COBOL クライアント。 cookpad-py を COBOL にリライトした。
HTTP は libcurl (C ブリッジ経由)、JSON は cJSON (C ブリッジ経由) を使ってる。
MSYS2 UCRT64 シェルで:
pacman -S --noconfirm mingw-w64-ucrt-x86_64-gnucobol
cobc --versioncd cobol/
make
./cookpad_demo.execobol/
├── src/
│ ├── COOKPAD-CONSTANTS.cbl # 定数 (constants.py)
│ ├── COOKPAD-TYPES.cbl # データ構造 (types.py dataclass)
│ ├── COOKPAD-HTTP.cbl # HTTP クライアント (client.py _request)
│ ├── COOKPAD-PARSE.cbl # JSON パーサー (types.py parse_*)
│ ├── COOKPAD-API.cbl # 公開 API (client.py メソッド群)
│ ├── DEMO.cbl # デモプログラム
│ ├── http_bridge.c # libcurl C ブリッジ
│ └── json_bridge.c # cJSON C ブリッジ
├── cjson/ # cJSON ライブラリ(同梱)
├── Makefile
└── README.md
レシピ検索。CALL で呼ぶ。
CALL "COOKPAD-SEARCH" USING
WS-QUERY *> PIC X(256) 検索キーワード
WS-PAGE *> PIC 9(5) ページ番号
WS-PER-PAGE *> PIC 9(3) 1ページの件数
WS-SEARCH-RESP *> 検索レスポンス構造体(出力)
WS-ERR-CODE. *> PIC 9(3) エラーコード(出力)
IF WS-ERR-CODE = 0
DISPLAY WS-SR-TOTAL-COUNT
PERFORM VARYING WS-IDX FROM 1 BY 1
UNTIL WS-IDX > WS-SR-COUNT
DISPLAY WS-SR-TITLE(WS-IDX)
END-PERFORM
END-IF.レシピ詳細を取得。
CALL "COOKPAD-GET-RECIPE" USING
WS-RECIPE-ID *> PIC 9(10) レシピ ID
WS-RECIPE *> レシピ構造体(出力)
WS-ERR-CODE. *> PIC 9(3) エラーコード(出力)
IF WS-ERR-CODE = 0
DISPLAY WS-RCP-TITLE
DISPLAY WS-RCP-USER-NAME
END-IF.ユーザー検索。
CALL "COOKPAD-SEARCH-USERS" USING
WS-QUERY
WS-PAGE
WS-PER-PAGE
WS-USERS-RESP
WS-ERR-CODE.Python 版の例外クラスに対応する 88 レベル条件名。
01 WS-ERROR-CODE PIC 9(3).
88 COOKPAD-OK VALUE 0.
88 COOKPAD-AUTH-ERROR VALUE 401.
88 COOKPAD-NOT-FOUND VALUE 404.
88 COOKPAD-RATE-LIMIT VALUE 429.
88 COOKPAD-API-ERROR VALUE 400.
88 COOKPAD-NET-ERROR VALUE 999.| Python | COBOL |
|---|---|
@dataclass |
01 WS-xxx. 05 ... (PIC 句) |
async/await |
同期(COBOL に非同期なし) |
parse_recipe(data) |
CALL "COOKPAD-PARSE-RECIPE" |
raise NotFoundError |
MOVE 404 TO LK-ERR |
import json |
CALL "JSON-PARSE" |
requests.get(url) |
CALL "COOKPAD-HTTP" |
The Unlicense (パブリックドメイン)