summaryrefslogtreecommitdiff
path: root/dmagick/Exception.d
blob: 6fbd8289cec67174c61143a554f5cf8a8b515f9e (plain)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
 * A class to expose ImageInfo QuantizeInfo and DrawInfo
 *
 * Copyright: Mike Wey 2011
 * License:   To be determined
 * Authors:   Mike Wey
 */

module dmagick.Exception;

import std.conv;

import dmagick.c.client;
import dmagick.c.exception;

/**
 * A base class for all exceptions thrown bij DMagick.
 * The following Exceptions are derived from this class: $(BR)$(BR)
 * ResourceLimitException, TypeException, OptionException,
 * DelegateException, MissingDelegateException, CorruptImageException,
 * FileOpenException, BlobException, StreamException, CacheException,
 * CoderException, FilterException, ModuleException, DrawException,
 * ImageException, WandException, RandomException, XServerException,
 * MonitorException, RegistryException, ConfigureException, PolicyException
 */
class MagickException : Exception
{
	this(string reason, string description)
	{
		string message = to!(string)(GetClientName());

		if ( reason.length > 0 )
			message ~= ": " ~ reason;
		if ( description.length > 0 )
			message ~= " (" ~ description ~ ")";

		super(message);
	}
}

/**
 * A base class for all errors thrown bij DMagick.
 * The following Errors are derived from this class: $(BR)$(BR)
 * ResourceLimitError, TypeError, OptionError,
 * DelegateError, MissingDelegateError, CorruptImageError,
 * FileOpenError, BlobError, StreamError, CacheError,
 * CoderError, FilterError, ModuleError, DrawError,
 * ImageError, WandError, RandomError, XServerError,
 * MonitorError, RegistryError, ConfigureError, PolicyError
 */
class MagickError : Error
{
	this(string reason, string description)
	{
		string message = to!(string)(GetClientName());

		if ( reason.length > 0 )
			message ~= ": " ~ reason;
		if ( description.length > 0 )
			message ~= " (" ~ description ~ ")";

		super(message);
	}
}

mixin(generateExceptions());

/**
 * Generate the exceptions and the throwException function;
 */
private string generateExceptions()
{
	string[] severities = [ "Blob", "Cache", "Coder", "Configure",
		"CorruptImage", "Delegate", "Draw", "FileOpen", "Filter",
		"Image", "MissingDelegate", "Module", "Monitor", "Option",
		"Policy", "Random", "Registry", "ResourceLimit", "Stream",
		"Type", "Wand", "XServer" ];

	string exceptions;

	exceptions ~= 
		"void throwException(ExceptionInfo* exception)
		 {
			if ( exception.severity == ExceptionType.UndefinedException )
				return;

			string reason      = to!(string)(exception.reason);
			string description = to!(string)(exception.description);	

			switch(exception.severity)
			{";

	foreach ( severity; severities )
	{
		exceptions ~=
			"case ExceptionType."~ severity ~"Warning:
				throw new "~ severity ~"Exception(reason, description);
				break;";
	}

	exceptions ~= "}}";

	foreach ( severity; severities )
	{
		exceptions ~= 
			"class " ~ severity ~ "Exception : MagickException
			 {
				this(string reason, string description)
				{
					super(reason, description);
				}
			 }";

		exceptions ~= 
			"class " ~ severity ~ "Error : MagickError
			 {
				this(string reason, string description)
				{
					super(reason, description);
				}
			 }";
	}

	return exceptions;
}