From be2f5d3d1de628ed6ef160ae3820fead34d22e4a Mon Sep 17 00:00:00 2001 From: mstar Date: Wed, 23 Apr 2025 16:18:24 +0200 Subject: [PATCH] Batman --- go.mod | 5 +++++ go.sum | 2 ++ informer.go | 25 +++++++++++++++++++++++++ node.go | 38 ++++++++++++++++++++++++++++++++++++++ parser.go | 13 +++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 informer.go create mode 100644 node.go create mode 100644 parser.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..970afc8 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module git.mstar.dev/mstar/treeificator + +go 1.24.2 + +require git.mstar.dev/mstar/goutils v1.12.3 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..bc5cf87 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +git.mstar.dev/mstar/goutils v1.12.3 h1:Wx7i8/a99Cp+Y/XcXgqQr0r9cSsJu7QkWBlKyprTH44= +git.mstar.dev/mstar/goutils v1.12.3/go.mod h1:juxY0eZEMnA95fedRp2LVXvUBgEjz66nE8SEdGKcxMA= diff --git a/informer.go b/informer.go new file mode 100644 index 0000000..66e3580 --- /dev/null +++ b/informer.go @@ -0,0 +1,25 @@ +package treeificator + +// Informers inform the parser about the prefix and suffix that make up a node +type Informer interface { + // Get the prefix starting the informer's node type + GetPrefix() string + // Get the suffix starting the informer's node type + GetSuffix() string + // Get the name of the node type. + // Each name (in lowercase) may only exist once. The parser will enforce this. + GetName() string +} + +// Defa +type DefaultInformer struct{} + +func (defaultinformer *DefaultInformer) GetPrefix() string { + return "" +} +func (defaultinformer *DefaultInformer) GetSuffix() string { + return "" +} +func (defaultinformer *DefaultInformer) GetName() string { + return "default" +} diff --git a/node.go b/node.go new file mode 100644 index 0000000..353ee1f --- /dev/null +++ b/node.go @@ -0,0 +1,38 @@ +package treeificator + +import "strings" + +type Node struct { + // What kind of node this is + NodeType Informer + // The elements in this node, ordered by appearance + Elements []NodeElement +} + +// An element in a node. Either a string or another node. +// Leaf elements will always be a string. +// Root element will always be a [DefaultInformaer]. +type NodeElement struct { + Text *string + Node *Node +} + +// Unmarshal a node into the string it got constructed from +func (n *Node) Unmarshal() string { + builder := strings.Builder{} + builder.WriteString(n.NodeType.GetPrefix()) + for _, elem := range n.Elements { + builder.WriteString(elem.Unmarshal()) + } + builder.WriteString(n.NodeType.GetSuffix()) + return builder.String() +} + +// Unmarshal an element into the string it got constructed from +func (e *NodeElement) Unmarshal() string { + if e.Text != nil { + return *e.Text + } else { + return e.Node.Unmarshal() + } +} diff --git a/parser.go b/parser.go new file mode 100644 index 0000000..05db78a --- /dev/null +++ b/parser.go @@ -0,0 +1,13 @@ +package treeificator + +func Marshal(raw string, informers ...Informer) Node { + prefixToInformer := map[string]Informer{} + return Node{ + NodeType: &DefaultInformer{}, + Elements: marshal(raw, prefixToInformer), + } +} + +func marshal(raw string, informers map[string]Informer) []NodeElement { + return []NodeElement{NodeElement{Text: &raw}} +}