1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
* This program creates a basic calculator endpoint that accepts and returns data in the specified format.
* It uses a RESTful API approach where the operation is specified in the URL path.
* The numbers to operate on are passed as query parameters.
* The result is returned as JSON.
*/
export default async function server(request: Request): Promise<Response> {
const url = new URL(request.url);
const operation = url.pathname.split('/').pop();
const numbers = url.searchParams.getAll('num').map(Number);
if (!operation || numbers.length === 0) {
return new Response(JSON.stringify({ error: "Invalid request" }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
let result: number;
try {
switch (operation) {
case "add":
result = add(numbers);
break;
case "subtract":
result = subtract(numbers);
break;
case "multiply":
result = multiply(numbers);
break;
case "divide":
result = divide(numbers);
break;
case "pow":
result = pow(numbers);
break;
case "sqrt":
result = sqrt(numbers[0]);
break;
case "log":
result = log(numbers[0]);
break;
default:
throw new Error("Invalid operation");
}
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
return new Response(JSON.stringify({ result }), {
headers: { 'Content-Type': 'application/json' }
});
}
function add(numbers: number[]): number {
return numbers.reduce((a, b) => a + b, 0);
}
function subtract(numbers: number[]): number {
return numbers.reduce((a, b) => a - b);
}
function multiply(numbers: number[]): number {
return numbers.reduce((a, b) => a * b, 1);
}
function divide(numbers: number[]): number {
if (numbers.includes(0)) {
throw new Error("Cannot divide by zero");
}
return numbers.reduce((a, b) => a / b);
}
function pow(numbers: number[]): number {
return numbers.reduce((a, b) => Math.pow(a, b));
}
function sqrt(number: number): number {
if (number < 0) {
throw new Error("Cannot calculate square root of a negative number");
}
return Math.sqrt(number);
}
function log(number: number): number {
if (number <= 0) {
throw new Error("Cannot calculate logarithm of a non-positive number");
}
return Math.log(number);
}
// Examples of proper queries:
// curl "https://username.val.town/calculator/add?num=5&num=3&num=2"
// curl "https://username.val.town/calculator/subtract?num=10&num=3&num=2"
// curl "https://username.val.town/calculator/multiply?num=2&num=3&num=4"