package config import ( "encoding/json" "io" "io/ioutil" "os" "golang.org/x/xerrors" ) type LocalPath struct { Path string } // .lotusstorage/storage.json type StorageConfig struct { StoragePaths []LocalPath } // [path]/metadata.json type StorageMeta struct { ID string Weight int // 0 = readonly CanCommit bool CanStore bool } func StorageFromFile(path string, def *StorageConfig) (*StorageConfig, error) { file, err := os.Open(path) switch { case os.IsNotExist(err): if def == nil { return nil, xerrors.Errorf("couldn't load storage config: %w", err) } return def, nil case err != nil: return nil, err } defer file.Close() //nolint:errcheck // The file is RO return StorageFromReader(file) } func StorageFromReader(reader io.Reader) (*StorageConfig, error) { var cfg StorageConfig err := json.NewDecoder(reader).Decode(&cfg) if err != nil { return nil, err } return &cfg, nil } func WriteStorageFile(path string, config StorageConfig) error { b, err := json.MarshalIndent(config, "", " ") if err != nil { return xerrors.Errorf("marshaling storage config: %w", err) } if err := ioutil.WriteFile(path, b, 0644); err != nil { return xerrors.Errorf("persisting storage config (%s): %w", path, err) } return nil }