yuku-t/textcomplete

View on GitHub
src/query.js

Summary

Maintainability
A
0 mins
Test Coverage
// @flow

import SearchResult from "./search_result"
import Strategy from "./strategy"
import type { MatchData } from "./strategy"

/**
 * Encapsulate matching condition between a Strategy and current editor's value.
 */
export default class Query {
  strategy: Strategy
  term: string
  match: MatchData

  /**
   * Build a Query object by the given string if this matches to the string.
   *
   * @param {string} text - Head to input cursor.
   */
  static build(strategy: Strategy, text: string): ?Query {
    if (typeof strategy.props.context === "function") {
      const context = strategy.props.context(text)
      if (typeof context === "string") {
        text = context
      } else if (!context) {
        return null
      }
    }
    const match = strategy.matchText(text)
    return match ? new Query(strategy, match[strategy.index], match) : null
  }

  constructor(strategy: Strategy, term: string, match: MatchData) {
    this.strategy = strategy
    this.term = term
    this.match = match
  }

  /**
   * Invoke search strategy and callback the given function.
   */
  execute(callback: (SearchResult[]) => void) {
    this.strategy.search(
      this.term,
      results => {
        callback(
          results.map(result => {
            return new SearchResult(result, this.term, this.strategy)
          }),
        )
      },
      this.match,
    )
  }
}