65 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package models | ||
|  | 
 | ||
|  | import ( | ||
|  | 	//"bufio" | ||
|  | 	//"bytes" | ||
|  | 	"encoding/json" | ||
|  | 	//"fmt" | ||
|  | 	//"errors" | ||
|  | 	//"regexp" | ||
|  | 	//"strings" | ||
|  | 	//"sync" | ||
|  | 	"time" | ||
|  | 	//"codeberg.org/danjones000/my-log/tools" | ||
|  | ) | ||
|  | 
 | ||
|  | type Metas []Meta | ||
|  | 
 | ||
|  | func (ms Metas) toMap() map[string]any { | ||
|  | 	out := map[string]any{} | ||
|  | 	for _, f := range ms { | ||
|  | 		if _, found := out[f.Key]; found || f.Key == "title" || f.Key == "date" { | ||
|  | 			continue | ||
|  | 		} | ||
|  | 		if f.Key == "json" { | ||
|  | 			ob := map[string]any{} | ||
|  | 			if j, ok := f.Value.(json.RawMessage); ok { | ||
|  | 				json.Unmarshal(j, &ob) | ||
|  | 			} | ||
|  | 			// If we couldn't get valid data from there, this will just be empty | ||
|  | 			for k, v := range ob { | ||
|  | 				if k != "title" && k != "date" { | ||
|  | 					out[k] = v | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} else { | ||
|  | 			out[f.Key] = f.Value | ||
|  | 			if vt, ok := f.Value.(time.Time); ok { | ||
|  | 				out[f.Key] = vt.Format(time.RFC3339) | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 	return out | ||
|  | } | ||
|  | 
 | ||
|  | func (ms Metas) MarshalJSON() ([]byte, error) { | ||
|  | 	return json.Marshal(ms.toMap()) | ||
|  | } | ||
|  | 
 | ||
|  | func (ms *Metas) UnmarshalJSON(in []byte) error { | ||
|  | 	old := (*ms).toMap() | ||
|  | 	out := map[string]any{} | ||
|  | 	err := json.Unmarshal(in, &out) | ||
|  | 	if err != nil { | ||
|  | 		return err | ||
|  | 	} | ||
|  | 	ret := *ms | ||
|  | 	for k, v := range out { | ||
|  | 		if _, found := old[k]; k != "title" && k != "date" && !found { | ||
|  | 			ret = append(ret, Meta{k, v}) | ||
|  | 		} | ||
|  | 	} | ||
|  | 	*ms = ret | ||
|  | 	return nil | ||
|  | } |