FOSSredder 0.5.0
Loading...
Searching...
No Matches
WorkspaceSession.cpp
Go to the documentation of this file.
1
5
7
8#include <stdexcept>
9
10namespace core::application {
11
12WorkspaceSession::WorkspaceSession(std::unique_ptr<core::ports::storage::IStorageManager> storageManager)
13 : storageManager_(std::move(storageManager)) {
14 if (!storageManager_) {
15 throw std::invalid_argument("WorkspaceSession requires a storage manager");
16 }
17
19}
20
21const std::string& WorkspaceSession::currentPath() const noexcept {
22 return storageManager_->currentPath();
23}
24
26 onStateChanged_ = std::move(cb);
27}
28
29void WorkspaceSession::setErrorReporter(std::shared_ptr<core::ports::diagnostics::IErrorReporter> reporter) {
30 errorReporter_ = std::move(reporter);
31}
32
34 storageManager_->setAtomicStoreSave(std::move(saveFn));
35}
36
38 storageManager_->setAtomicStoreLoad(std::move(loadFn));
39}
40
42 onDeletionImpact_ = std::move(cb);
43 storageManager_->setDeletionImpactCallback([this](const DeletionImpact& impact) {
44 try {
45 if (onDeletionImpact_) {
46 onDeletionImpact_(impact);
47 }
48 } catch (...) {
50 "WorkspaceSession::setDeletionImpactCallback",
51 std::current_exception());
52 }
53 });
54}
55
57 const auto path = storageManager_->loadLatestPath();
58 if (!path) {
59 return;
60 }
61
62 try {
63 document_ = storageManager_->loadFrom(*path);
65 } catch (...) {
67 "WorkspaceSession::openLatest",
68 std::current_exception());
69 document_ = {};
71 }
72}
73
74void WorkspaceSession::newFile(const std::string& path) {
75 storageManager_->createNew(path);
76 document_ = {};
78}
79
80void WorkspaceSession::openFile(const std::string& path) {
81 try {
82 document_ = storageManager_->loadFrom(path);
84 } catch (...) {
86 "WorkspaceSession::openFile",
87 std::current_exception());
88 throw;
89 }
90}
91
93 storageManager_->save(document_);
94}
95
96void WorkspaceSession::saveFileAs(const std::string& path) {
97 storageManager_->saveAs(path, document_);
98}
99
101 try {
102 const std::string& path = storageManager_->currentPath();
103 if (!path.empty()) {
104 storageManager_->save(document_);
105 }
106 } catch (...) {
108 "WorkspaceSession::commit",
109 std::current_exception());
110 }
111
112 notifyState();
113}
114
116 try {
117 if (onStateChanged_) {
118 onStateChanged_(document_);
119 }
120 } catch (...) {
122 "WorkspaceSession::notifyState",
123 std::current_exception());
124 }
125}
126
127void WorkspaceSession::reportException(core::errors::ErrorSeverity severity,
128 const char* origin,
129 std::exception_ptr exception) const {
130 if (!errorReporter_) {
131 return;
132 }
133
134 errorReporter_->reportException(severity, origin, exception);
135}
136
137} // namespace core::application
Declares the mutable workspace session that ties in-memory state to storage.
void setAtomicStoreLoad(core::ports::storage::IStorageManager::AtomicStoreLoad loadFn)
void newFile(const std::string &path)
void setDeletionImpactCallback(core::ports::storage::IStorageManager::DeletionImpactCallback cb)
void setStateChangedCallback(StateChanged cb)
void setErrorReporter(std::shared_ptr< core::ports::diagnostics::IErrorReporter > reporter)
void commit()
Persists the session when a file is open and notifies listeners.
void saveFileAs(const std::string &path)
const std::string & currentPath() const noexcept
void openFile(const std::string &path)
std::function< void(const core::application::workspace::WorkspaceSessionState &)> StateChanged
void setAtomicStoreSave(core::ports::storage::IStorageManager::AtomicStoreSave saveFn)
WorkspaceSession(std::unique_ptr< core::ports::storage::IStorageManager > storageManager)
Creates a session over an existing storage manager.
std::function< void(const core::domain::DeletionImpact &)> DeletionImpactCallback
std::function< core::application::workspace::WorkspaceSessionState(const std::string &dbPath)> AtomicStoreLoad
std::function< core::domain::DeletionImpact(const std::string &dbPath, const core::application::workspace::WorkspaceSessionState &document)> AtomicStoreSave
Destroy the storage manager port.
ErrorSeverity
Severity level for structured error events.
Definition ErrorEvent.h:17
Lists entity identifiers removed by cascading workspace operations.