func importBucket(b *bolt.Bucket, children []*rawMessage) error { // Decode each message into a key/value pair. for _, child := range children { // Bucket messages are handled recursively. if child.Type == "bucket" { // Create the bucket if it doesn't exist. subbucket, err := b.CreateBucketIfNotExists(child.Key) if err != nil { return fmt.Errorf("create bucket: %s", err) } // Decode child messages. var subchildren []*rawMessage if err := json.Unmarshal(child.Value, &subchildren); err != nil { return fmt.Errorf("decode children: %s", err) } // Import subbucket. if err := importBucket(subbucket, subchildren); err != nil { return fmt.Errorf("import bucket: %s", err) } continue } // Non-bucket values are decoded from base64. var value []byte if err := json.Unmarshal(child.Value, &value); err != nil { return fmt.Errorf("decode value: %s", err) } // Insert key/value into bucket. if err := b.Put(child.Key, value); err != nil { return fmt.Errorf("put: %s", err) } } return nil }