diff --git a/doc.go b/doc.go index 4280e57..a96e245 100644 --- a/doc.go +++ b/doc.go @@ -10,6 +10,8 @@ // journal, and purge interval are already known. Prefer the struct literal // over `store.New(..., store.WithJournal(...))` when the full configuration is // already available, because it reads as data rather than a chain of steps. +// Use `store.WithWorkspaceStateDirectory("/tmp/core-state")` when the +// workspace path is assembled incrementally rather than declared up front. // // Usage example: // diff --git a/store.go b/store.go index 775d5fa..4746273 100644 --- a/store.go +++ b/store.go @@ -169,6 +169,16 @@ func WithJournal(endpointURL, organisation, bucketName string) StoreOption { } } +// Usage example: `storeInstance, err := store.New(":memory:", store.WithWorkspaceStateDirectory("/tmp/core-state"))` +func WithWorkspaceStateDirectory(directory string) StoreOption { + return func(storeConfig *StoreConfig) { + if storeConfig == nil { + return + } + storeConfig.WorkspaceStateDirectory = directory + } +} + // Usage example: `config := storeInstance.JournalConfiguration(); fmt.Println(config.EndpointURL, config.Organisation, config.BucketName)` func (storeInstance *Store) JournalConfiguration() JournalConfiguration { if storeInstance == nil { @@ -194,7 +204,7 @@ func (storeInstance *Store) Config() StoreConfig { DatabasePath: storeInstance.databasePath, Journal: storeInstance.JournalConfiguration(), PurgeInterval: storeInstance.purgeInterval, - WorkspaceStateDirectory: storeInstance.workspaceStateDirectoryPath(), + WorkspaceStateDirectory: storeInstance.WorkspaceStateDirectory(), } } @@ -206,6 +216,14 @@ func (storeInstance *Store) DatabasePath() string { return storeInstance.databasePath } +// Usage example: `stateDirectory := storeInstance.WorkspaceStateDirectory(); fmt.Println(stateDirectory)` +func (storeInstance *Store) WorkspaceStateDirectory() string { + if storeInstance == nil { + return normaliseWorkspaceStateDirectory(defaultWorkspaceStateDirectory) + } + return storeInstance.workspaceStateDirectoryPath() +} + // Usage example: `if storeInstance.IsClosed() { return }` func (storeInstance *Store) IsClosed() bool { if storeInstance == nil { diff --git a/store_test.go b/store_test.go index f74b6fe..215c8e8 100644 --- a/store_test.go +++ b/store_test.go @@ -108,6 +108,23 @@ func TestStore_New_Good_WithJournalOption(t *testing.T) { assert.Equal(t, "http://127.0.0.1:8086", storeInstance.journalConfiguration.EndpointURL) } +func TestStore_New_Good_WithWorkspaceStateDirectoryOption(t *testing.T) { + workspaceStateDirectory := testPath(t, "workspace-state-option") + + storeInstance, err := New(":memory:", WithWorkspaceStateDirectory(workspaceStateDirectory)) + require.NoError(t, err) + defer storeInstance.Close() + + assert.Equal(t, workspaceStateDirectory, storeInstance.WorkspaceStateDirectory()) + + workspace, err := storeInstance.NewWorkspace("scroll-session") + require.NoError(t, err) + defer workspace.Discard() + + assert.Equal(t, workspaceFilePath(workspaceStateDirectory, "scroll-session"), workspace.DatabasePath()) + assert.True(t, testFilesystem().Exists(workspace.DatabasePath())) +} + func TestStore_NewConfigured_Good_WorkspaceStateDirectory(t *testing.T) { workspaceStateDirectory := testPath(t, "workspace-state") @@ -128,6 +145,15 @@ func TestStore_NewConfigured_Good_WorkspaceStateDirectory(t *testing.T) { assert.True(t, testFilesystem().Exists(workspace.DatabasePath())) } +func TestStore_WorkspaceStateDirectory_Good_Default(t *testing.T) { + storeInstance, err := New(":memory:") + require.NoError(t, err) + defer storeInstance.Close() + + assert.Equal(t, normaliseWorkspaceStateDirectory(defaultWorkspaceStateDirectory), storeInstance.WorkspaceStateDirectory()) + assert.Equal(t, storeInstance.WorkspaceStateDirectory(), storeInstance.Config().WorkspaceStateDirectory) +} + func TestStore_JournalConfiguration_Good(t *testing.T) { storeInstance, err := New(":memory:", WithJournal("http://127.0.0.1:8086", "core", "events")) require.NoError(t, err)