upend/tools/upend_js/query.ts

55 lines
1.4 KiB
TypeScript

import type { Address } from "./types";
import { isAddress } from "./types";
type OneOrMany<T> = T | T[];
export class Query {
private _query: string | undefined;
public matches(
entity: OneOrMany<string> | undefined,
attribute: OneOrMany<string> | undefined,
value: OneOrMany<string | number | Address> | undefined
): Query {
const query = new Query();
let entityStr;
if (entity === undefined) {
entityStr = "?";
} else {
entityStr = Array.isArray(entity) ? `(in ${entity.join(" ")})` : entity;
}
let attributeStr;
if (attribute === undefined) {
attributeStr = "?";
} else {
attributeStr = Array.isArray(attribute)
? `(in ${attribute.map((a) => `"${a}"`).join(" ")})`
: `"${attribute}"`;
}
let valueStr;
if (value === undefined) {
valueStr = "?";
} else {
valueStr = (Array.isArray(value) ? value : [value])
.map((v) => {
if (typeof v === "number") return v;
if (isAddress(v)) return v;
if (typeof v === "string") return `"${v}"`;
})
.join(" ");
valueStr = Array.isArray(value) ? `(in ${valueStr})` : valueStr;
}
query._query = `(matches ${entityStr} ${attributeStr} ${valueStr})`;
return query;
}
public toString(): string {
if (!this._query) throw new Error("Query is not defined");
return this._query;
}
}