From ec7091be519298c6549f4d9068e95c9e815eeba8 Mon Sep 17 00:00:00 2001 From: Cory Slep Date: Sat, 5 Jan 2019 21:54:00 +0100 Subject: [PATCH] Add serialization and comparison for rdf:langString --- tools/exp/rdf/ontology.go | 110 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 3 deletions(-) diff --git a/tools/exp/rdf/ontology.go b/tools/exp/rdf/ontology.go index c2eb11a..485704d 100644 --- a/tools/exp/rdf/ontology.go +++ b/tools/exp/rdf/ontology.go @@ -162,21 +162,125 @@ func (l *langstring) Apply(key string, value interface{}, ctx *ParsingContext) ( langstringSpec, jen.Map(jen.String()).String(), []jen.Code{ - // TODO + jen.Return( + jen.Id(codegen.This()), + jen.Nil(), + ), }), DeserializeFn: DeserializeValueFunction( l.pkg, langstringSpec, jen.Map(jen.String()).String(), []jen.Code{ - // TODO + jen.If( + jen.List( + jen.Id("m"), + jen.Id("ok"), + ).Op(":=").Id(codegen.This()).Assert(jen.Map(jen.String()).Interface()), + jen.Id("ok"), + ).Block( + jen.Id("r").Op(":=").Make(jen.Map(jen.String()).String()), + jen.For( + jen.List( + jen.Id("k"), + jen.Id("v"), + ).Op(":=").Range().Id("m"), + ).Block( + jen.If( + jen.List( + jen.Id("s"), + jen.Id("ok"), + ).Op(":=").Id("v").Assert(jen.String()), + jen.Id("ok"), + ).Block( + jen.Id("r").Index(jen.Id("k")).Op("=").Id("s"), + ).Else().Block( + jen.Return( + jen.Nil(), + jen.Qual("fmt", "Errorf").Call( + jen.Lit("value %v cannot be interpreted as a string for rdf:langString"), + jen.Id("v"), + ), + ), + ), + ), + jen.Return( + jen.Id("r"), + jen.Nil(), + ), + ).Else().Block( + jen.Return( + jen.Nil(), + jen.Qual("fmt", "Errorf").Call( + jen.Lit("%v cannot be interpreted as a map[string]interface{} for rdf:langString"), + jen.Id(codegen.This()), + ), + ), + ), }), LessFn: LessFunction( l.pkg, langstringSpec, jen.Map(jen.String()).String(), []jen.Code{ - // TODO + jen.Var().Id("lk").Index().String(), + jen.Var().Id("rk").Index().String(), + jen.For( + jen.List( + jen.Id("k"), + ).Op(":=").Range().Id("lhs"), + ).Block( + jen.Id("lk").Op("=").Append( + jen.Id("lk"), + jen.Id("k"), + ), + ), + jen.For( + jen.List( + jen.Id("k"), + ).Op(":=").Range().Id("rhs"), + ).Block( + jen.Id("rk").Op("=").Append( + jen.Id("rk"), + jen.Id("k"), + ), + ), + jen.Qual("sort", "Sort").Call( + jen.Qual("sort", "StringSlice").Call(jen.Id("lk")), + ), + jen.Qual("sort", "Sort").Call( + jen.Qual("sort", "StringSlice").Call(jen.Id("rk")), + ), + jen.For( + jen.Id("i").Op(":=").Lit(0), + jen.Id("i").Op("<").Len(jen.Id("lk")).Op("&&").Id("i").Op("<").Len(jen.Id("rk")), + jen.Id("i").Op("++"), + ).Block( + jen.If( + jen.Id("lk").Index(jen.Id("i")).Op("<").Id("rk").Index(jen.Id("i")), + ).Block( + jen.Return(jen.True()), + ).Else().If( + jen.Id("rk").Index(jen.Id("i")).Op("<").Id("lk").Index(jen.Id("i")), + ).Block( + jen.Return(jen.False()), + ).Else().If( + jen.Id("lhs").Index(jen.Id("lk").Index(jen.Id("i"))).Op("<").Id("rhs").Index(jen.Id("rk").Index(jen.Id("i"))), + ).Block( + jen.Return(jen.True()), + ).Else().If( + jen.Id("rhs").Index(jen.Id("rk").Index(jen.Id("i"))).Op("<").Id("lhs").Index(jen.Id("lk").Index(jen.Id("i"))), + ).Block( + jen.Return(jen.False()), + ), + ), + jen.If( + jen.Len(jen.Id("lk")).Op("<").Len(jen.Id("rk")), + ).Block( + jen.Return(jen.True()), + ).Else().Block( + jen.Return(jen.False()), + ), }), }) return true, e