Don't use output parameters for error handling

This commit is contained in:
Vladimir Golovnev (Glassez)
2021-10-06 21:45:37 +03:00
parent 4d480b8761
commit 41fc0fd084
12 changed files with 116 additions and 165 deletions

View File

@@ -142,67 +142,59 @@ Session *Session::instance()
return m_instance;
}
bool Session::addFolder(const QString &path, QString *error)
nonstd::expected<void, QString> Session::addFolder(const QString &path)
{
Folder *destFolder = prepareItemDest(path, error);
if (!destFolder)
return false;
const nonstd::expected<Folder *, QString> result = prepareItemDest(path);
if (!result)
return result.get_unexpected();
const auto destFolder = result.value();
addItem(new Folder(path), destFolder);
store();
return true;
return {};
}
bool Session::addFeed(const QString &url, const QString &path, QString *error)
nonstd::expected<void, QString> Session::addFeed(const QString &url, const QString &path)
{
if (m_feedsByURL.contains(url))
{
if (error)
*error = tr("RSS feed with given URL already exists: %1.").arg(url);
return false;
}
return nonstd::make_unexpected(tr("RSS feed with given URL already exists: %1.").arg(url));
Folder *destFolder = prepareItemDest(path, error);
if (!destFolder)
return false;
const nonstd::expected<Folder *, QString> result = prepareItemDest(path);
if (!result)
return result.get_unexpected();
const auto destFolder = result.value();
addItem(new Feed(generateUID(), url, path, this), destFolder);
store();
if (m_processingEnabled)
feedByURL(url)->refresh();
return true;
return {};
}
bool Session::moveItem(const QString &itemPath, const QString &destPath, QString *error)
nonstd::expected<void, QString> Session::moveItem(const QString &itemPath, const QString &destPath)
{
if (itemPath.isEmpty())
{
if (error)
*error = tr("Cannot move root folder.");
return false;
}
return nonstd::make_unexpected(tr("Cannot move root folder."));
auto item = m_itemsByPath.value(itemPath);
if (!item)
{
if (error)
*error = tr("Item doesn't exist: %1.").arg(itemPath);
return false;
}
return nonstd::make_unexpected(tr("Item doesn't exist: %1.").arg(itemPath));
return moveItem(item, destPath, error);
return moveItem(item, destPath);
}
bool Session::moveItem(Item *item, const QString &destPath, QString *error)
nonstd::expected<void, QString> Session::moveItem(Item *item, const QString &destPath)
{
Q_ASSERT(item);
Q_ASSERT(item != rootFolder());
Folder *destFolder = prepareItemDest(destPath, error);
if (!destFolder)
return false;
const nonstd::expected<Folder *, QString> result = prepareItemDest(destPath);
if (!result)
return result.get_unexpected();
auto srcFolder = static_cast<Folder *>(m_itemsByPath.value(Item::parentPath(item->path())));
const auto destFolder = result.value();
if (srcFolder != destFolder)
{
srcFolder->removeItem(item);
@@ -211,25 +203,17 @@ bool Session::moveItem(Item *item, const QString &destPath, QString *error)
m_itemsByPath.insert(destPath, m_itemsByPath.take(item->path()));
item->setPath(destPath);
store();
return true;
return {};
}
bool Session::removeItem(const QString &itemPath, QString *error)
nonstd::expected<void, QString> Session::removeItem(const QString &itemPath)
{
if (itemPath.isEmpty())
{
if (error)
*error = tr("Cannot delete root folder.");
return false;
}
return nonstd::make_unexpected(tr("Cannot delete root folder."));
auto item = m_itemsByPath.value(itemPath);
auto *item = m_itemsByPath.value(itemPath);
if (!item)
{
if (error)
*error = tr("Item doesn't exist: %1.").arg(itemPath);
return false;
}
return nonstd::make_unexpected(tr("Item doesn't exist: %1.").arg(itemPath));
emit itemAboutToBeRemoved(item);
item->cleanup();
@@ -238,7 +222,7 @@ bool Session::removeItem(const QString &itemPath, QString *error)
folder->removeItem(item);
delete item;
store();
return true;
return {};
}
QList<Item *> Session::items() const
@@ -395,30 +379,18 @@ void Session::store()
m_confFileStorage->store(FeedsFileName, QJsonDocument(rootFolder()->toJsonValue().toObject()).toJson());
}
Folder *Session::prepareItemDest(const QString &path, QString *error)
nonstd::expected<Folder *, QString> Session::prepareItemDest(const QString &path)
{
if (!Item::isValidPath(path))
{
if (error)
*error = tr("Incorrect RSS Item path: %1.").arg(path);
return nullptr;
}
return nonstd::make_unexpected(tr("Incorrect RSS Item path: %1.").arg(path));
if (m_itemsByPath.contains(path))
{
if (error)
*error = tr("RSS item with given path already exists: %1.").arg(path);
return nullptr;
}
return nonstd::make_unexpected(tr("RSS item with given path already exists: %1.").arg(path));
const QString destFolderPath = Item::parentPath(path);
auto destFolder = qobject_cast<Folder *>(m_itemsByPath.value(destFolderPath));
const auto destFolder = qobject_cast<Folder *>(m_itemsByPath.value(destFolderPath));
if (!destFolder)
{
if (error)
*error = tr("Parent folder doesn't exist: %1.").arg(destFolderPath);
return nullptr;
}
return nonstd::make_unexpected(tr("Parent folder doesn't exist: %1.").arg(destFolderPath));
return destFolder;
}

View File

@@ -73,6 +73,8 @@
#include <QPointer>
#include <QTimer>
#include "base/3rdparty/expected.hpp"
class QThread;
class Application;
@@ -110,12 +112,11 @@ namespace RSS
int refreshInterval() const;
void setRefreshInterval(int refreshInterval);
bool addFolder(const QString &path, QString *error = nullptr);
bool addFeed(const QString &url, const QString &path, QString *error = nullptr);
bool moveItem(const QString &itemPath, const QString &destPath
, QString *error = nullptr);
bool moveItem(Item *item, const QString &destPath, QString *error = nullptr);
bool removeItem(const QString &itemPath, QString *error = nullptr);
nonstd::expected<void, QString> addFolder(const QString &path);
nonstd::expected<void, QString> addFeed(const QString &url, const QString &path);
nonstd::expected<void, QString> moveItem(const QString &itemPath, const QString &destPath);
nonstd::expected<void, QString> moveItem(Item *item, const QString &destPath);
nonstd::expected<void, QString> removeItem(const QString &itemPath);
QList<Item *> items() const;
Item *itemByPath(const QString &path) const;
@@ -146,7 +147,7 @@ namespace RSS
void loadFolder(const QJsonObject &jsonObj, Folder *folder);
void loadLegacy();
void store();
Folder *prepareItemDest(const QString &path, QString *error);
nonstd::expected<Folder *, QString> prepareItemDest(const QString &path);
Folder *addSubfolder(const QString &name, Folder *parentFolder);
Feed *addFeedToFolder(const QUuid &uid, const QString &url, const QString &name, Folder *parentFolder);
void addItem(Item *item, Folder *destFolder);