root/src/apps/haikudepot/packagemodel/PackageCoreInfo.cpp
/*
 * Copyright 2024-2025, Andrew Lindesay <apl@lindesay.co.nz>.
 * All rights reserved. Distributed under the terms of the MIT License.
 */


#include "PackageCoreInfo.h"

#include "Package.h"


PackageCoreInfo::PackageCoreInfo()
        :
        fVersion(),
        fPublisher(),
        fArchitecture(),
        fDepotName()
{
}


PackageCoreInfo::PackageCoreInfo(const PackageCoreInfo& other)
        :
        fVersion(other.fVersion),
        fPublisher(other.fPublisher),
        fArchitecture(other.fArchitecture),
        fDepotName(other.fDepotName)
{
}


PackageCoreInfo::~PackageCoreInfo()
{
}


bool
PackageCoreInfo::operator==(const PackageCoreInfo& other) const
{
        return fVersion == other.fVersion
                && fPublisher == other.fPublisher
                && fArchitecture == other.fArchitecture
                && fDepotName == other.fDepotName;
}


bool
PackageCoreInfo::operator!=(const PackageCoreInfo& other) const
{
        return !(*this == other);
}


const PackageVersionRef&
PackageCoreInfo::Version() const
{
        return fVersion;
}


const PackagePublisherInfoRef&
PackageCoreInfo::Publisher() const
{
        return fPublisher;
}


const BString
PackageCoreInfo::Architecture() const
{
        return fArchitecture;
}


const BString&
PackageCoreInfo::DepotName() const
{
        return fDepotName;
}


void
PackageCoreInfo::SetVersion(PackageVersionRef value)
{
        fVersion = value;
}


void
PackageCoreInfo::SetPublisher(PackagePublisherInfoRef value)
{
        fPublisher = value;
}


void
PackageCoreInfo::SetArchitecture(const BString& value)
{
        fArchitecture = value;
}


void
PackageCoreInfo::SetDepotName(const BString& value)
{
        fDepotName = value;
}


// #pragma mark - PackageCoreInfoBuilder


PackageCoreInfoBuilder::PackageCoreInfoBuilder()
        :
        fVersion(),
        fPublisher(),
        fArchitecture(),
        fDepotName()
{
}


PackageCoreInfoBuilder::PackageCoreInfoBuilder(const PackageCoreInfoRef& other)
        :
        fVersion(),
        fPublisher(),
        fArchitecture(),
        fDepotName()
{
        fSource = other;
}


PackageCoreInfoBuilder::~PackageCoreInfoBuilder()
{
}


void
PackageCoreInfoBuilder::_InitFromSource()
{
        if (fSource.IsSet()) {
                _Init(fSource.Get());
                fSource.Unset();
        }
}


void
PackageCoreInfoBuilder::_Init(const PackageCoreInfo* other)
{
        fVersion = other->Version();
        fPublisher = other->Publisher();
        fArchitecture = other->Architecture();
        fDepotName = other->DepotName();
}


PackageCoreInfoRef
PackageCoreInfoBuilder::BuildRef()
{
        if (fSource.IsSet())
                return fSource;

        PackageCoreInfo* coreInfo = new PackageCoreInfo();
        coreInfo->SetVersion(fVersion);
        coreInfo->SetPublisher(fPublisher);
        coreInfo->SetArchitecture(fArchitecture);
        coreInfo->SetDepotName(fDepotName);

        return PackageCoreInfoRef(coreInfo, true);
}


PackageCoreInfoBuilder&
PackageCoreInfoBuilder::WithVersion(PackageVersionRef value)
{
        if (!fSource.IsSet() || fSource->Version() != value) {
                _InitFromSource();
                fVersion = value;
        }
        return *this;
}


PackageCoreInfoBuilder&
PackageCoreInfoBuilder::WithPublisher(PackagePublisherInfoRef value)
{
        if (!fSource.IsSet() || fSource->Publisher() != value) {
                _InitFromSource();
                fPublisher = value;
        }
        return *this;
}


PackageCoreInfoBuilder&
PackageCoreInfoBuilder::WithArchitecture(const BString& value)
{
        if (!fSource.IsSet() || fSource->Architecture() != value) {
                _InitFromSource();
                fArchitecture = value;
        }
        return *this;
}


PackageCoreInfoBuilder&
PackageCoreInfoBuilder::WithDepotName(const BString& value)
{
        if (!fSource.IsSet() || fSource->DepotName() != value) {
                _InitFromSource();
                fDepotName = value;
        }
        return *this;
}