util.dataforms: Add support for datetime field types via XEP-0122
authorKim Alvefur <zash@zash.se>
Mon, 25 Oct 2021 21:45:46 +0200
changeset 11878 84f4c6957d62
parent 11877 2b85e4e7d389
child 11879 210a785dfa8a
util.dataforms: Add support for datetime field types via XEP-0122
spec/util_dataforms_spec.lua
util/dataforms.lua
--- a/spec/util_dataforms_spec.lua	Mon Oct 25 21:45:06 2021 +0200
+++ b/spec/util_dataforms_spec.lua	Mon Oct 25 21:45:46 2021 +0200
@@ -446,6 +446,20 @@
 			assert.table(e);
 			assert.string(e.number);
 		end);
+
+		describe("datetime", function ()
+			local f = dataforms.new { { name = "when"; type = "text-single"; datatype = "xs:dateTime" } } -- luacheck: ignore 431
+
+			it("works", function ()
+				local x = f:form({ when = "2008-08-22T21:09:00Z" });
+				assert.equal("2008-08-22T21:09:00Z", x:find("field/value#"))
+				local d, e = f:data(x);
+				assert.is_nil(e);
+				assert.same({ when = 1219439340 }, d);
+			end);
+
+		end)
+
 	end);
 	describe("media element", function ()
 		it("produced media element correctly", function ()
--- a/util/dataforms.lua	Mon Oct 25 21:45:06 2021 +0200
+++ b/util/dataforms.lua	Mon Oct 25 21:45:46 2021 +0200
@@ -14,6 +14,7 @@
 local t_concat = table.concat;
 local st = require "util.stanza";
 local jid_prep = require "util.jid".prep;
+local datetime = require "util.datetime";
 
 local _ENV = nil;
 -- luacheck: std none
@@ -321,6 +322,13 @@
 		end
 	end
 
+data_validators["xs:dateTime"] =
+	function(data, field) -- luacheck: ignore 212/field
+		local n = datetime.parse(data);
+		if not n then return false, "invalid timestamp"; end
+		return true, n;
+	end
+
 
 local function get_form_type(form)
 	if not st.is_stanza(form) then