summaryrefslogtreecommitdiff
path: root/add.go
diff options
context:
space:
mode:
Diffstat (limited to 'add.go')
-rw-r--r--add.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/add.go b/add.go
new file mode 100644
index 0000000..02b42a6
--- /dev/null
+++ b/add.go
@@ -0,0 +1,63 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "go.wit.com/lib/protobuf/chatpb"
+ "go.wit.com/log"
+)
+
+// addFile reads a protobuf text file, inlines all external content, and returns
+// a self-contained *chatpb.Chats object.
+func addFile(filename string) (*chatpb.Chats, error) {
+ data, err := os.ReadFile(filename)
+ if err != nil {
+ return nil, fmt.Errorf("failed to read file %s: %w", filename, err)
+ }
+
+ logData, err := chatpb.UnmarshalChatsTEXT(data)
+ if err != nil {
+ return nil, fmt.Errorf("failed to unmarshal log file %s: %w", filename, err)
+ }
+
+ log.Infof("Successfully parsed log file: %s", filename)
+
+ // Get the directory of the log file to resolve relative content paths.
+ logDir := filepath.Dir(filename)
+
+ // Iterate through the structure to inline all external content.
+ for _, chat := range logData.GetChats() {
+ for _, entry := range chat.GetEntries() {
+ // Inline main content from ContentFile
+ if contentFile := entry.GetContentFile(); contentFile != "" {
+ contentPath := filepath.Join(logDir, contentFile)
+ contentBytes, err := os.ReadFile(contentPath)
+ if err != nil {
+ entry.Content = fmt.Sprintf("--- ERROR: Could not read content file %s: %v ---", contentPath, err)
+ } else {
+ entry.Content = string(contentBytes)
+ }
+ }
+
+ // Inline snippet content from snippet files
+ if snippets := entry.GetSnippets(); snippets != nil {
+ for _, snippet := range snippets {
+ if snippetFile := snippet.GetFilename(); snippetFile != "" {
+ snippetPath := filepath.Join(logDir, snippetFile)
+ contentBytes, err := os.ReadFile(snippetPath)
+ if err != nil {
+ snippet.Content = fmt.Sprintf("--- ERROR: Could not read snippet file %s: %v ---", snippetPath, err)
+ } else {
+ snippet.Content = string(contentBytes)
+ }
+ }
+ }
+ }
+ }
+ }
+
+ log.Info("Successfully inlined all external content.")
+ return logData, nil
+}