aboutsummaryrefslogtreecommitdiffstats
path: root/nihil.ucl/type.cc
blob: a008aa395d3cf30315472d67104cf3ae24c535e1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
 * This source code is released into the public domain.
 */

module;

#include <format>

module nihil.ucl;

namespace nihil::ucl {

auto str(object_type type) -> std::string_view {
	using namespace std::literals;

	switch (type) {
	case object_type::object:
		return "object"sv;
	case object_type::array:
		return "array"sv;
	case object_type::integer:
		return "integer"sv;
	case object_type::real:
		return "real"sv;
	case object_type::string:
		return "string"sv;
	case object_type::boolean:
		return "boolean"sv;
	case object_type::time:
		return "time"sv;
	case object_type::userdata:
		return "userdata"sv;
	case object_type::null:
		return "null"sv;
	default:
		// Don't fail here, since UCL might add more types that we
		// don't know about.
		return "unknown"sv;
	}
}

type_mismatch::type_mismatch(
	object_type expected_type, object_type actual_type)
	: error(std::format("UCL type mismatch: expected type '{}' "
			    "!= actual type '{}'",
			    str(expected_type), str(actual_type)))
	, _expected_type(expected_type)
	, _actual_type(actual_type)
{
}

auto type_mismatch::expected_type(this type_mismatch const &self) -> object_type
{
	return self._expected_type;
}

auto type_mismatch::actual_type(this type_mismatch const &self) -> object_type
{
	return self._actual_type;
}
	
} // namespace nihil::ucl