Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 56 additions & 11 deletions src/io.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,55 @@ WriteVTK.VTKCellType(::Type{<:Quadrilateral2D}) = VTKCellTypes.VTK_QUAD
WriteVTK.VTKCellType(::Type{<:Tetrahedron3D}) = VTKCellTypes.VTK_TETRA
WriteVTK.VTKCellType(::Type{<:Hexahedron3D}) = VTKCellTypes.VTK_HEXAHEDRON

struct ExtensionLoadError <: Exception
fname::Symbol
weakdeps::Vector{Symbol}
end

Base.showerror(io::IO, e::ExtensionLoadError) =
print(
io,
"ExtensionLoadError: "
* "The function " * String(e.fname) * " is part of an extension.\n"
* "Suggestion: Install and load the following modules:"
* mapreduce(x -> "\n" * x, *, String.(e.weakdeps))
)

struct ExtensionMethodError <: Exception
fn::Function
args::Tuple
end


function Base.showerror(io::IO, e::ExtensionMethodError)
fname = String(nameof(e.fn))
argtypes = typeof.(e.args)
println(io,
"ExtensionMethodError: no method matching " * fname
* "(" * join(map(x-> "::"*String(nameof(x)),argtypes),',')
* ")")
println(io,"The function " * fname * " exists in a loaded extension,"
*" but no method is defined for this combination of argument types.\n"
* "\nCandidates are:\n"
)
println.(io, filter(x -> x != which(e.fn, (argtypes...,)), methods(e.fn)))
return nothing
end

function prepare_extension_function(fname::Symbol, weakdeps::Vector{Symbol}, args::Vector{Symbol})
expr = quote
function $fname($(args...); kwargs...)
if mapreduce(x -> isdefined(Main, x) && isa(getfield(Main,x),Module), &, $weakdeps)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess you want to reduce by the operator && and not the binary &? I think they behave the same, but && is clearer

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would but reduce does not like that operator for some reason

throw(ExtensionMethodError($fname, ($(args...),)))
else
throw(ExtensionLoadError(nameof($fname), $weakdeps))
end
return nothing
end
end
return eval(expr)
end

"""
$(TYPEDSIGNATURES)

Expand Down Expand Up @@ -162,19 +211,11 @@ function simplexgrid(file::String; format = "", kwargs...)
end

function simplexgrid(file::String, ::Type{Val{:msh}}; kwargs...)
return try
simplexgrid_from_gmsh(file)
catch e
throw(ErrorException("Missing Gmsh extension. Add Gmsh.jl to your environment and import it to read msh files."))
end
return simplexgrid_from_gmsh(file)
end

function simplexgrid(file::String, ::Type{Val{:geo}}; kwargs...)
return try
simplexgrid_from_gmsh(file)
catch e
throw(ErrorException("Missing Gmsh extension. Add Gmsh.jl to your environment and import it to read geo files."))
end
return simplexgrid_from_gmsh(file)
end

function simplexgrid(file::String, ::Type{Val{:sg}}; kwargs...)
Expand Down Expand Up @@ -272,7 +313,11 @@ function simplexgrid(file::String, ::Type{Val{:sg}}; kwargs...)
return g
end

function simplexgrid_from_gmsh end
prepare_extension_function(:simplexgrid_from_gmsh, [:Gmsh], [:filename])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer to enforce key word arguments here:

prepare_extension_function(:simplexgrid_from_gmsh, weakdeps = [:Gmsh], args = [:filename])

# function simplexgrid_from_gmsh(filename; incomplete = false, Tc = Float32, Ti = Int32)
# throw(ErrorException("Missing Gmsh extension. Add Gmsh.jl to your environment and import it to read msh or geo files."))
# end


function simplexgrid_to_gmsh end

Expand Down
Loading