1 | // Generated by LiveScript 1.6.0
|
---|
2 | (function(){
|
---|
3 | var reject, special, tokenRegex;
|
---|
4 | reject = require('prelude-ls').reject;
|
---|
5 | function consumeOp(tokens, op){
|
---|
6 | if (tokens[0] === op) {
|
---|
7 | return tokens.shift();
|
---|
8 | } else {
|
---|
9 | throw new Error("Expected '" + op + "', but got '" + tokens[0] + "' instead in " + JSON.stringify(tokens) + ".");
|
---|
10 | }
|
---|
11 | }
|
---|
12 | function maybeConsumeOp(tokens, op){
|
---|
13 | if (tokens[0] === op) {
|
---|
14 | return tokens.shift();
|
---|
15 | }
|
---|
16 | }
|
---|
17 | function consumeList(tokens, arg$, hasDelimiters){
|
---|
18 | var open, close, result, untilTest;
|
---|
19 | open = arg$[0], close = arg$[1];
|
---|
20 | if (hasDelimiters) {
|
---|
21 | consumeOp(tokens, open);
|
---|
22 | }
|
---|
23 | result = [];
|
---|
24 | untilTest = "," + (hasDelimiters ? close : '');
|
---|
25 | while (tokens.length && (hasDelimiters && tokens[0] !== close)) {
|
---|
26 | result.push(consumeElement(tokens, untilTest));
|
---|
27 | maybeConsumeOp(tokens, ',');
|
---|
28 | }
|
---|
29 | if (hasDelimiters) {
|
---|
30 | consumeOp(tokens, close);
|
---|
31 | }
|
---|
32 | return result;
|
---|
33 | }
|
---|
34 | function consumeArray(tokens, hasDelimiters){
|
---|
35 | return consumeList(tokens, ['[', ']'], hasDelimiters);
|
---|
36 | }
|
---|
37 | function consumeTuple(tokens, hasDelimiters){
|
---|
38 | return consumeList(tokens, ['(', ')'], hasDelimiters);
|
---|
39 | }
|
---|
40 | function consumeFields(tokens, hasDelimiters){
|
---|
41 | var result, untilTest, key;
|
---|
42 | if (hasDelimiters) {
|
---|
43 | consumeOp(tokens, '{');
|
---|
44 | }
|
---|
45 | result = {};
|
---|
46 | untilTest = "," + (hasDelimiters ? '}' : '');
|
---|
47 | while (tokens.length && (!hasDelimiters || tokens[0] !== '}')) {
|
---|
48 | key = consumeValue(tokens, ':');
|
---|
49 | consumeOp(tokens, ':');
|
---|
50 | result[key] = consumeElement(tokens, untilTest);
|
---|
51 | maybeConsumeOp(tokens, ',');
|
---|
52 | }
|
---|
53 | if (hasDelimiters) {
|
---|
54 | consumeOp(tokens, '}');
|
---|
55 | }
|
---|
56 | return result;
|
---|
57 | }
|
---|
58 | function consumeValue(tokens, untilTest){
|
---|
59 | var out;
|
---|
60 | untilTest == null && (untilTest = '');
|
---|
61 | out = '';
|
---|
62 | while (tokens.length && -1 === untilTest.indexOf(tokens[0])) {
|
---|
63 | out += tokens.shift();
|
---|
64 | }
|
---|
65 | return out;
|
---|
66 | }
|
---|
67 | function consumeElement(tokens, untilTest){
|
---|
68 | switch (tokens[0]) {
|
---|
69 | case '[':
|
---|
70 | return consumeArray(tokens, true);
|
---|
71 | case '(':
|
---|
72 | return consumeTuple(tokens, true);
|
---|
73 | case '{':
|
---|
74 | return consumeFields(tokens, true);
|
---|
75 | default:
|
---|
76 | return consumeValue(tokens, untilTest);
|
---|
77 | }
|
---|
78 | }
|
---|
79 | function consumeTopLevel(tokens, types, options){
|
---|
80 | var ref$, type, structure, origTokens, result, finalResult, x$, y$;
|
---|
81 | ref$ = types[0], type = ref$.type, structure = ref$.structure;
|
---|
82 | origTokens = tokens.concat();
|
---|
83 | if (!options.explicit && types.length === 1 && ((!type && structure) || (type === 'Array' || type === 'Object'))) {
|
---|
84 | result = structure === 'array' || type === 'Array'
|
---|
85 | ? consumeArray(tokens, tokens[0] === '[')
|
---|
86 | : structure === 'tuple'
|
---|
87 | ? consumeTuple(tokens, tokens[0] === '(')
|
---|
88 | : consumeFields(tokens, tokens[0] === '{');
|
---|
89 | finalResult = tokens.length ? consumeElement(structure === 'array' || type === 'Array'
|
---|
90 | ? (x$ = origTokens, x$.unshift('['), x$.push(']'), x$)
|
---|
91 | : (y$ = origTokens, y$.unshift('('), y$.push(')'), y$)) : result;
|
---|
92 | } else {
|
---|
93 | finalResult = consumeElement(tokens);
|
---|
94 | }
|
---|
95 | return finalResult;
|
---|
96 | }
|
---|
97 | special = /\[\]\(\)}{:,/.source;
|
---|
98 | tokenRegex = RegExp('("(?:\\\\"|[^"])*")|(\'(?:\\\\\'|[^\'])*\')|(/(?:\\\\/|[^/])*/[a-zA-Z]*)|(#.*#)|([' + special + '])|([^\\s' + special + '](?:\\s*[^\\s' + special + ']+)*)|\\s*');
|
---|
99 | module.exports = function(types, string, options){
|
---|
100 | var tokens, node;
|
---|
101 | options == null && (options = {});
|
---|
102 | if (!options.explicit && types.length === 1 && types[0].type === 'String') {
|
---|
103 | return string;
|
---|
104 | }
|
---|
105 | tokens = reject(not$, string.split(tokenRegex));
|
---|
106 | node = consumeTopLevel(tokens, types, options);
|
---|
107 | if (!node) {
|
---|
108 | throw new Error("Error parsing '" + string + "'.");
|
---|
109 | }
|
---|
110 | return node;
|
---|
111 | };
|
---|
112 | function not$(x){ return !x; }
|
---|
113 | }).call(this);
|
---|