All files / src/parsers ternary.js

100% Statements 3/3
100% Branches 2/2
100% Functions 2/2
100% Lines 3/3

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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                        9x 9x                             642x                        
// @flow
 
import P from 'parsimmon'
import crap from './crap'
 
import type {
  TupleNodeType,
  ParserType,
  NodeType
} from '../types'
 
export default P.lazy((): ParserType => {
  const TupleParser = require('./collections/tuple').default
  return P.seq(
    TupleParser,
    P.seq(
      P.string('if')
        .trim(crap)
        .then(TupleParser),
      P.string('else')
        .trim(crap)
        .then(TupleParser)
    ).atMost(1)
  ).map(
    ([tuple, rest]: [
      TupleNodeType,
      Array<[TupleNodeType, TupleNodeType]>
    ]): NodeType =>
      rest.length === 0
        ? tuple
        : {
          name: 'ternary',
          value: {
            left: tuple,
            middle: rest[0][0],
            right: rest[0][1]
          }
        }
  )
})