-
Notifications
You must be signed in to change notification settings - Fork 0
/
reportlevel.jl
53 lines (45 loc) · 1.72 KB
/
reportlevel.jl
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
@enum RL ThrowError ShowMessage SkipInitCheck
@kwdef mutable struct ModuleEntry
rl::RL = ThrowError
init_created::Bool = false
const postinit::Vector{Function} = Vector()
end
"This gives us a list of all modules that are actively using Inherit.jl, if we ever need it"
const DB_FLAGS = Dict{Module, ModuleEntry}()
GLOBAL_RL::RL = ThrowError
"
Sets the default reporting level of modules; it does not change the setting for modules that already loaded an Inherit.jl macro.
"
function setglobalreportlevel(rl::RL)
global GLOBAL_RL = rl
end
"
Sets the level of reporting for the given module. Takes precedence over global report level.
`ThrowError`: Checks for interface requirements in the module `__init__()` function, throwing an exception if requirements are not met. Creates `__init__()` upon first use of @abstractbase or @implement.
`ShowMessage`: Same as above, but an `Error` level log message is produced rather than throwing exception.
`SkipInitCheck`: Still creates `__init__()` function (which sets up datastructures that may be needed by other modules) but won't verfiy interfaces. Cannot be set if `__init__()` has already been created
"
function setreportlevel(mod::Module, rl::RL)
# if ME already has been created, we cannot change the between DisableInit and other states
if haskey(DB_FLAGS, mod)
me = getmoduleentry(mod)
if (rl==SkipInitCheck) ⊻ (me.rl==SkipInitCheck)
throw(SettingsError("cannot change from current setting from $(me.rl) to $(rl)"))
else
me.rl = rl
end
else
me = getmoduleentry(mod)
me.rl = rl
end
end
function getmoduleentry(mod::Module)
if !haskey(DB_FLAGS, mod)
me = ModuleEntry() #kw constructor slow?
me.rl = GLOBAL_RL
DB_FLAGS[mod] = me
me
else
DB_FLAGS[mod]
end
end