// suppress inspection "GrazieInspection" for whole file
// suppress inspection "GrazieInspection"
= How to use the jwz module by example
Jim Idle <jimi@gatherstars.com>
0.9.0, August 10, 2021: Explaining jwz module by example
:toc:
:icons: font
:keywords: jwz email parsing threading enmime
ifdef::env-github[]
:tip-caption: :bulb:
:note-caption: :information_source:
:important-caption: :heavy_exclamation_mark:
:caution-caption: :fire:
:warning-caption: :warning:
:imagesdir: https://github.com/gatherstars-com/jwz/raw/master/docs/img/
:showtitle:
endif::[]
ifndef::env-github[]
:imagesdir: ../../docs/img/
endif::[]
image:clonobg.png[Gather Stars Logo, 100, 100] This visualize tool is a working example showing how to use the
Gather Stars, Inc. version of the widely known JWZ message threading algorithm originally written by
Jamie Zawinsky - see https://www.jwz.org/doc/threading.html[his explanation here].
This example demonstrates the use of go interfaces of the package. Obviously, so long as your own structure can
implement the `Threadable` interface, then you can implement the email inputs however you like.
The package is advertised as production quality, but the examples are obviously not.
== Following the example code
.The code is easy enough, with the `main.go` file showing how to:
* Parse raw .eml files in to email envelopes using the excellent https://github.com/jhillyerd/enmime[Enmime go module]
* Wrap the parsed envelopes in to a set of Threadable interfaces
* Thread the set using the jwz package
* Use the supplied Sort utility func to sort the threadable tree
* Use the https://github.com/rivo/tview[tview] package to create an ASCII display tree of the emails to show humans that
threading is working. The package tests verify it is working for programs.
.The `handlers.go` file provides:
* Sample implementation of the interface, called Email, which you can crib from (also, see the jwz_test.go file for an
example of how to thread an arbitrary data model instead of a simple slice)
* Some utility funcs
** buildEnvelopes parses all the .eml files it finds into a slice of Email structs
** byDate is an example sorting function, which obviously sorts by the email date
== Trying it out
The repo provides a publicly available email set under test/testdata. Clone this repo and then
run it like this:
====
$ vizualize -emldir path/to/test/testdata
====
You will see some diagnostics about the quality of the test set (it is deliberately broken in some places for the
unit tests), you should see a treeview in your terminal that looks like this:
image::screen2.png[Image of threaded tree]
If you don't need that testdata and just want to try the command on your own dataset, then there is no need to clone
this repo. You can just install the `visualize` command into `${GOPATH}/bin`:
====
~/lufc/ > go install github.com/gatherstars-com/jwz/examples/visualize@latest
====
Where I am sure it will clash with 42 other commands called visualize.