module dud.pkgdescription.validation;

import std.array : empty;
import std.algorithm.iteration : each, filter;
import std.exception : enforce;

import dud.pkgdescription;
import dud.pkgdescription.exception;

@safe:

void validate(ref const(PackageDescription) pkg) {
	enforce!EmptyNameException(!pkg.name.empty,
		"The name must not be empty");
	pkg.buildTypes.validate();
	pkg.configurations.each!(conf => validate(conf));
}

void validate(const(BuildType[string]) bts) {
	bts.byValue().each!(bt => validate(bt));
}

void validate(ref const(BuildType) bts) {
	enforce!BuildTypeException(bts.pkg.dependencies.empty,
		"A BuiltType must not have dependencies");
	enforce!BuildTypeException(bts.pkg.targetType == TargetType.autodetect,
		"TargetType must be not be set");
	enforce!BuildTypeException(bts.pkg.targetName.empty,
		"TargetName can not be changed");
	enforce!BuildTypeException(bts.pkg.targetPath.path.empty,
		"TargetPath can not be changed");
	enforce!BuildTypeException(bts.pkg.workingDirectory.path.empty,
		"WorkingDirectory can not be changed");
	enforce!BuildTypeException(bts.pkg.subConfigurations.configs.empty
			&& bts.pkg.subConfigurations.unspecifiedPlatform.empty,
		"SubConfigurations can not be changed");
}