modularize: typedef, parser

This commit is contained in:
qwjyh 2023-10-22 19:28:15 +09:00
parent 658c15cb80
commit 881d542a30
No known key found for this signature in database
GPG key ID: F30838CD89227A79
7 changed files with 122 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
Manifest.toml

10
Project.toml Normal file
View file

@ -0,0 +1,10 @@
name = "CoordVisualize"
uuid = "4c41ebcf-33aa-4478-9aac-83d12758d145"
authors = ["qwjyh <urataw421@gmail.com>"]
version = "0.1.0"
[deps]
ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a"
YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6"

6
README.adoc Normal file
View file

@ -0,0 +1,6 @@
= CoordVisualize
== Parsing log, taggin and exporting
== Reading data & Visualization, inspecting

8
src/CoordVisualize.jl Normal file
View file

@ -0,0 +1,8 @@
module CoordVisualize
using Dates
include("typedef.jl")
include("parser.jl")
end # end module CoordVisualize

90
src/parser.jl Normal file
View file

@ -0,0 +1,90 @@
using CoordVisualize: CoordLog
using Dates
"""
parse_log(filepath::AbstractString; interactive=false)::Vector{CoordLog}
Parse raw coordinates log from tracecoords to vector of `CoordLog`.
Each logging is converted to one `CoordLog`.
If keyword argument `interactive` is set to `true`, prompts will be shown to
receive custom notes for each `CoordLog`.
Otherwise the note is set to ""(empty string).
"""
function parse_log(filepath::AbstractString; interactive=false)::Vector{CoordLog}
istracing::Bool = false
coords_trace = Vector{Vector{Float64}}(undef, 0) # SVector ?
ret = Vector{CoordLog}()
log_date = DateTime(0)
for (i, l) in enumerate(readlines(filepath))
# skip logs not from tracecoord
if match(r"^\[TRACECOORDS\]", l) |> isnothing
continue
end
if !istracing
# not tracing
# if starting
if match(r"Logging starting", l) |> !isnothing
@debug "Logging started at l:$(i)"
istracing = true
coords_trace = Vector{Vector{Float64}}(undef, 0) # SVector ?
log_date = try
s = match(r"\".+\"").match
parse(DateTime, s[2:end-1])
catch e
@error "Failed to parse date at line $(i), file $(filepath)"
DateTime(0)
end
end
else
if match(r"Logging stopping", l) |> !isnothing
@debug "Logging stopped at l:$(i)"
istracing = false
# get note in interactive parsing
if interactive
println("type note for the log at $(log_date)UTC")
note = readline()
else
note = ""
end
coords_trace = mapreduce(permutedims, vcat, coords_trace)
push!(
ret,
CoordLog(coords_trace, log_date, note)
)
continue
end
# skip non coordinates
if match(r"Coordinate:", l) |> isnothing
continue
end
# parse coordinates
coord = try
match(r"\(.*\)", l).match |>
(s -> split(s[2:end-1], ',')) .|>
(x -> parse(Float64, x))
catch e
error("Failed to parse coordinate at line $(i)")
end
push!(coords_trace, coord)
end
end
ret
end
function parse_log(filepaths::Vector{T}; interactive=false)::Vector{CoordLog} where {T <: AbstractString}
map(filepaths) do filepath
parse_log(filepath; interactive=interactive)
end |> Iterators.flatten |> collect
end
CoordLog(
[1.0 2.0 3.0; 4.0 5.0 6.0],
Dates.now(),
"a"
)

7
src/typedef.jl Normal file
View file

@ -0,0 +1,7 @@
using Dates
struct CoordLog{T <: AbstractFloat}
coords::Matrix{T}
logdate::DateTime
note::String
end

0
test/runtests.jl Normal file
View file