Skip to content

Commit 8f68f59

Browse files
authored
C++ element definitions now support any kind of arithmetic types (#11)
Updated static list parser. Now it can have same syntax as any script may have. E.g.: - `{1,2,3}` lua style list; - `[1,2,3]` js style list; - `(a,b,c)` python tuple; Old syntax without brackets is also supported. Additionally fixed several issues in tests, improved test coverage, added tests for parser, field validation. Found a problem with `required` field not working for fields that are missing from the xml node (only if field parsing failed we were getting an error).
1 parent e869c47 commit 8f68f59

File tree

12 files changed

+621
-155
lines changed

12 files changed

+621
-155
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Vue Special Syntax
4646
- `v-if/v-else-if/v-else`.
4747
- `v-for` (does not support int index e.g.: `value, key, index`).
4848
- `v-on`.
49-
- `v-on:(click:mousedown|mouseup|mouseover|mouseout)[.[ctrl|alt|meta|shift|exact]]`.
49+
- `v-on:(click|mousedown|mouseup|mouseover|mouseout)[.[ctrl|alt|meta|shift|exact]]`.
5050
- `v-on:(keyup|keydown|keypress)[.][<key_code>]`.
5151
- `v-on:change`.
5252
- Attributes starting with `:` are treated as `v-bind:...`.

src/imvue.cpp

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -257,32 +257,6 @@ namespace ImVue {
257257
return;
258258
}
259259

260-
if(!mConfigured) {
261-
// register some built-in element types
262-
mCtx->factory->element<Document>("template");
263-
mCtx->factory->element<Element>("__element__")
264-
.handler<MouseEventHandler>("click")
265-
.handler<MouseEventHandler>("mousedown")
266-
.handler<MouseEventHandler>("mouseup")
267-
.handler<MouseEventHandler>("mouseover")
268-
.handler<MouseEventHandler>("mouseout")
269-
.handler<MouseEventHandler>("mouseout")
270-
.handler<ChangeEventHandler>("change")
271-
.handler<KeyboardEventHandler>("keydown")
272-
.handler<KeyboardEventHandler>("keyup")
273-
.handler<KeyboardEventHandler>("keypress")
274-
.attribute("id", &Element::id)
275-
.attribute("key", &Element::key)
276-
.attribute("ref", &Element::ref);
277-
278-
mCtx->factory->element<Slot>("slot");
279-
280-
mCtx->factory->element<SvgImage>("svg-image")
281-
.attribute("size", &SvgImage::size)
282-
.attribute("src", &SvgImage::src, true)
283-
.attribute("tint-col", &SvgImage::tint_col);
284-
}
285-
286260
mScriptState = mCtx->script;
287261

288262
std::stringstream ss;

src/imvue_element.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ namespace ImVue {
225225
, mScriptContext(0)
226226
, mInvalidFlags(0)
227227
, mFlags(0)
228+
, mRequiredAttrsCount(0)
228229
, mConfigured(false)
229230
{
230231
}
@@ -349,6 +350,9 @@ namespace ImVue {
349350
Attribute* reader = mBuilder->get(id);
350351
if(reader) {
351352
reader->read(id, value, this, mScriptState, flags, fields);
353+
if(reader->required) {
354+
mRequiredAttrsCount++;
355+
}
352356
return true;
353357
}
354358

@@ -366,6 +370,7 @@ namespace ImVue {
366370
}
367371

368372
int flags = mConfigured ? 0 : Attribute::BIND_LISTENERS;
373+
mRequiredAttrsCount = 0;
369374

370375
for(const rapidxml::xml_attribute<>* a = mNode->first_attribute(); a; a = a->next_attribute()) {
371376
readProperty(a->name(), a->value(), flags);
@@ -376,6 +381,26 @@ namespace ImVue {
376381
if(ref && mScriptState) {
377382
mScriptState->addReference(ref, this);
378383
}
384+
385+
const ElementBuilder::RequiredAttrs& requiredAttrs = mBuilder->getRequiredAttrs();
386+
if(mRequiredAttrsCount != requiredAttrs.size()) {
387+
std::map<const char*, bool, CmpChar> visited;
388+
// failed validation, now scan props and detect which one is missing
389+
for(const rapidxml::xml_attribute<>* a = mNode->first_attribute(); a; a = a->next_attribute()) {
390+
visited[a->name()] = true;
391+
}
392+
393+
std::stringstream missed;
394+
for(int i = 0; i < requiredAttrs.size(); ++i) {
395+
const char* name = requiredAttrs[i];
396+
if(!visited[name]) {
397+
missed << (missed.str().empty() ? "" : ", ") << '"' << name << '"';
398+
}
399+
}
400+
401+
IMVUE_EXCEPTION(ElementError, "failed to build element %s, missing required properties %s", getType(), missed.str().c_str());
402+
return false;
403+
}
379404
return enabled;
380405
}
381406

@@ -483,7 +508,7 @@ namespace ImVue {
483508

484509
EventHandler* handler = builder->createHandler(handlerName, fullName, value);
485510
if(!handler) {
486-
IMVUE_EXCEPTION(ElementError, "failed create handler of type %s", handlerName);
511+
IMVUE_EXCEPTION(ElementError, "failed to create handler of type %s", handlerName);
487512
return;
488513
}
489514
mHandlers[name] = handler;

0 commit comments

Comments
 (0)