1 
2 #include <iostream>
3 #include <sstream>
4 
5 #include "data.hpp"
6 
7 #include "lambdas.hpp"
8 
add_lambda(mustache::Lambda * lambda,mustache::Data * data)9 static void add_lambda(mustache::Lambda * lambda, mustache::Data * data)
10 {
11 	mustache::Data * child = new mustache::Data();
12 	child->type = mustache::Data::TypeLambda;
13 	child->lambda = lambda;
14 	if( data->type == mustache::Data::TypeMap ) {
15 		data->data.erase("lambda");
16 		data->data.insert(std::pair<std::string,mustache::Data *>("lambda", child));
17 	} else {
18 		std::cerr << "Root data was not a map!" << std::endl;
19 		delete child;
20 	}
21 }
22 
load_lambdas_into_test_data(mustache::Data * data,std::string name)23 void load_lambdas_into_test_data(mustache::Data * data, std::string name)
24 {
25 	if( name.compare("Interpolation") == 0 ) {
26 		add_lambda(new StaticLambda("world"), data);
27 	} else if( name.compare("Interpolation - Expansion") == 0 ) {
28 		add_lambda(new StaticLambda("{{planet}}"), data);
29 	} else if( name.compare("Interpolation - Alternate Delimiters") == 0 ) {
30 		add_lambda(new StaticLambda("|planet| => {{planet}}"), data);
31 	} else if( name.compare("Interpolation - Multiple Calls") == 0 ) {
32 		add_lambda(new MultipleCallsLambda(), data);
33 	} else if( name.compare("Escaping") == 0 ) {
34 		add_lambda(new StaticLambda(">"), data);
35 	} else if( name.compare("Section") == 0 ) {
36 		add_lambda(new SectionLambda(), data);
37 	} else if( name.compare("Section - Expansion") == 0 ) {
38 		add_lambda(new SectionExpansionLambda(), data);
39 	} else if( name.compare("Section - Alternate Delimiters") == 0 ) {
40 		add_lambda(new SectionAlternateDelimitersLambda(), data);
41 	} else if( name.compare("Section - Multiple Calls") == 0 ) {
42 		add_lambda(new SectionMultipleCallsLambda(), data);
43 	} else if( name.compare("Inverted Section") == 0 ) {
44 		add_lambda(new StaticLambda(""), data);
45 	}
46 }
47 
48 
49 
invoke()50 std::string MultipleCallsLambda::invoke() {
51 	std::ostringstream st;
52 	st << std::dec << ++this->counter;
53 	return st.str();
54 }
55 
invoke(std::string * text,mustache::Renderer * renderer)56 std::string MultipleCallsLambda::invoke(std::string * text, mustache::Renderer * renderer) {
57 	return invoke();
58 }
59 
60 
61 
invoke()62 std::string SectionLambda::invoke() {
63 	throw new mustache::Exception("This is a section lambda");
64 }
65 
invoke(std::string * text,mustache::Renderer * renderer)66 std::string SectionLambda::invoke(std::string * text, mustache::Renderer * renderer) {
67 	if( text->compare("{{x}}") == 0 ) {
68 		return "yes";
69 	} else {
70 		return "no";
71 	}
72 }
73 
74 
75 
76 
invoke()77 std::string SectionExpansionLambda::invoke() {
78 	throw new mustache::Exception("This is a section lambda");
79 }
80 
invoke(std::string * text,mustache::Renderer * renderer)81 std::string SectionExpansionLambda::invoke(std::string * text, mustache::Renderer * renderer) {
82 	std::ostringstream st;
83 	st << *text << "{{planet}}" << *text;
84 	return st.str();
85 }
86 
87 
88 
89 
invoke()90 std::string SectionAlternateDelimitersLambda::invoke() {
91 	throw new mustache::Exception("This is a section lambda");
92 }
93 
invoke(std::string * text,mustache::Renderer * renderer)94 std::string SectionAlternateDelimitersLambda::invoke(std::string * text, mustache::Renderer * renderer) {
95 	std::ostringstream st;
96 	st << *text << "{{planet}} => |planet|" << *text;
97 	return st.str();
98 }
99 
100 
101 
102 
invoke()103 std::string SectionMultipleCallsLambda::invoke() {
104 	throw new mustache::Exception("This is a section lambda");
105 }
106 
invoke(std::string * text,mustache::Renderer * renderer)107 std::string SectionMultipleCallsLambda::invoke(std::string * text, mustache::Renderer * renderer) {
108 	std::ostringstream st;
109 	st << "__";
110 	st << *text;
111 	st << "__";
112 	return st.str();
113 }
114 
115