55 lines
1.4 KiB
TypeScript
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;
|
||
|
}
|
||
|
}
|