propero-oss/easy-filter

View on GitHub
src/processor/logical-filter-processor.ts

Summary

Maintainability
A
0 mins
Test Coverage
F
0%
import type { Filter, LogicalNotFilter, LogicalOperator, LogicalSetFilter } from "../types";
import type { FilterProcessor, UnprocessedFilter } from "../parser";
import { and, or, not } from "../helper";

export function logicalSetFilterProcessor(
  alias: string,
  operator: LogicalOperator,
  helper: (filters: Filter[]) => LogicalSetFilter
): FilterProcessor<LogicalSetFilter> {
  return {
    operator,
    alias,
    validateParams(...params): boolean {
      return !params.find((it) => typeof it === "string");
    },
    process(next: (raw: UnprocessedFilter) => Filter, ...params): LogicalSetFilter {
      return helper((params as UnprocessedFilter[]).map(next));
    },
    serializeParams(next: (filter: Filter) => string, escape: (str: string) => string, filter: LogicalSetFilter): string[] {
      return filter.filters.map(next);
    },
  };
}

export const andProcessor = logicalSetFilterProcessor("and", "and", and);
export const orProcessor = logicalSetFilterProcessor("or", "or", or);
export const notProcessor: FilterProcessor<LogicalNotFilter> = {
  operator: "not",
  alias: "not",
  validateParams(...params: (string | UnprocessedFilter)[]): boolean {
    return params.length === 1 && typeof params[0] !== "string";
  },
  process(next: (raw: UnprocessedFilter) => Filter, ...params: (string | UnprocessedFilter)[]): LogicalNotFilter {
    return not(next(params[0] as UnprocessedFilter));
  },
  serializeParams(next: (filter: Filter) => string, escape: (str: string) => string, filter: LogicalNotFilter): string[] {
    return [next(filter.filter)];
  },
};