@@ -7,6 +7,8 @@ use anyhow::Context;
7
7
use fs_err:: File ;
8
8
use serde:: Deserialize ;
9
9
use serde:: Serialize ;
10
+ use serde_json:: value:: RawValue ;
11
+ use std:: borrow:: Cow ;
10
12
use std:: collections:: BTreeMap ;
11
13
use std:: io:: Seek ;
12
14
use std:: io:: Write ;
@@ -15,8 +17,8 @@ use std::path::Path;
15
17
/// On-disk format for the var db
16
18
#[ derive( Serialize , Deserialize ) ]
17
19
#[ serde( transparent) ]
18
- struct VarDb {
19
- vars : BTreeMap < String , ( bool , serde_json :: Value ) > ,
20
+ struct VarDb < ' a > {
21
+ vars : BTreeMap < String , ( bool , Cow < ' a , RawValue > ) > ,
20
22
}
21
23
22
24
/// Implements [`flowey_core::node::RuntimeVarDb`] backed by a JSON file.
@@ -47,7 +49,7 @@ impl SingleJsonFileVarDb {
47
49
Ok ( Self { file } )
48
50
}
49
51
50
- fn load_db ( & mut self ) -> VarDb {
52
+ fn load_db ( & mut self ) -> VarDb < ' static > {
51
53
self . file . rewind ( ) . unwrap ( ) ;
52
54
serde_json:: from_reader ( & self . file ) . expect ( "corrupt runtime variable db" )
53
55
}
@@ -57,30 +59,26 @@ impl flowey_core::node::RuntimeVarDb for SingleJsonFileVarDb {
57
59
fn try_get_var ( & mut self , var_name : & str ) -> Option < ( Vec < u8 > , bool ) > {
58
60
let db = self . load_db ( ) ;
59
61
let ( is_secret, ref val) = * db. vars . get ( var_name) ?;
60
- let val = val. to_string ( ) ;
61
62
if is_secret {
62
63
log:: debug!( "[db] read var: {} = <secret>" , var_name) ;
63
64
} else {
64
65
log:: debug!( "[db] read var: {} = {}" , var_name, val) ;
65
66
}
66
- Some ( ( val. into ( ) , is_secret) )
67
+ Some ( ( val. get ( ) . into ( ) , is_secret) )
67
68
}
68
69
69
70
fn set_var ( & mut self , var_name : & str , is_secret : bool , value : Vec < u8 > ) {
71
+ let value: & RawValue = serde_json:: from_slice ( & value)
72
+ . unwrap_or_else ( |err| panic ! ( "invalid JSON for var {}: {}" , var_name, err) ) ;
70
73
if is_secret {
71
74
log:: debug!( "[db] set var: {} = <secret>" , var_name)
72
75
} else {
73
- log:: debug!(
74
- "[db] set var: {} = {}" ,
75
- var_name,
76
- String :: from_utf8_lossy( & value)
77
- )
76
+ log:: debug!( "[db] set var: {} = {}" , var_name, value)
78
77
} ;
79
78
let mut db = self . load_db ( ) ;
80
- let existing = db. vars . insert (
81
- var_name. into ( ) ,
82
- ( is_secret, serde_json:: from_slice ( & value) . unwrap ( ) ) ,
83
- ) ;
79
+ let existing = db
80
+ . vars
81
+ . insert ( var_name. into ( ) , ( is_secret, Cow :: Borrowed ( value) ) ) ;
84
82
assert ! ( existing. is_none( ) ) ; // all vars are one-time-write
85
83
self . file . set_len ( 0 ) . unwrap ( ) ;
86
84
self . file . rewind ( ) . unwrap ( ) ;
0 commit comments