interface get { "/item": { parameters: { query: { uuid: string; }; }; return: Item; }; "/items": { parameters: { query?: never; }; return?: Array; }; "/case": { parameters: { query: { uuid: string; }; }; return: Case; }; "/cases": { parameters: { query?: never; }; return?: Array; }; } interface post { "/login": { parameters: { query?: never; body: { username: string; password: string; }; }; return: User; }; "/logout": { parameters: { query?: never; body?: never; }; return?: never; }; "/register": { parameters: { query?: never; body: { username: string; password: string; email: string; }; }; return?: never; }; } export interface Item { uuid: string; name: string; rarity: number; price: number; image: string; } export interface Case { uuid: string; name: string; price: number; image: string; } export interface User { uuid: string; username: string; } class Client { baseUrl: string; constructor(baseUrl: string) { this.baseUrl = baseUrl; } async GET( path: T, parameters: get[T]["parameters"] ): Promise<[get[T]["return"], number]> { let query = parameters["query"] ? "?" + new URLSearchParams(parameters["query"]) : ""; let response = await fetch(this.baseUrl + path + query, { method: "GET", headers: { "Content-Type": "application/json", }, }); let data = await response.json(); return [data, response.status]; } async POST( path: T, parameters: post[T]["parameters"] ): Promise<[post[T]["return"], number]> { let query = parameters["query"] ? "?" + new URLSearchParams(parameters["query"]) : ""; let response = await fetch(this.baseUrl + path + query, { method: "POST", body: JSON.stringify(parameters["body"]), headers: { "Content-Type": "application/json", }, }); let data; try { data = await response.json(); } catch (_) { data = null; } return [data, response.status]; } } const client = new Client("http://127.0.0.1:8000"); export default client;