1+ package processing.app.api
2+
3+ import com.github.ajalt.clikt.command.SuspendingCliktCommand
4+ import com.github.ajalt.clikt.core.Context
5+ import com.github.ajalt.clikt.core.subcommands
6+ import com.github.ajalt.clikt.parameters.arguments.argument
7+ import com.github.ajalt.clikt.parameters.arguments.help
8+ import com.github.ajalt.clikt.parameters.options.flag
9+ import com.github.ajalt.clikt.parameters.options.help
10+ import com.github.ajalt.clikt.parameters.options.option
11+ import processing.app.Language
12+ import processing.app.Platform
13+ import processing.app.Preferences
14+ import java.io.File
15+
16+ class SketchCommand : SuspendingCliktCommand (" sketch" ){
17+ override fun help (context : Context ) = " Manage a Processing sketch"
18+ override suspend fun run () {
19+
20+ }
21+ init {
22+ subcommands(Format ())
23+ }
24+
25+ class Format : SuspendingCliktCommand (" format" ){
26+ override fun help (context : Context ) = " Format a Processing sketch"
27+ val file by argument(" file" )
28+ .help(" Path to the sketch file to format" )
29+ val inPlace by option(" -i" ," --inplace" )
30+ .flag()
31+ .help(" Format the file in place, otherwise prints to stdout" )
32+
33+ override suspend fun run (){
34+ try {
35+ Platform .init ()
36+ Language .init ()
37+ Preferences .init ()
38+
39+ // run in headless mode
40+ System .setProperty(" java.awt.headless" , " true" )
41+
42+ val clazz = Class .forName(" processing.mode.java.AutoFormat" )
43+ // Indirect invocation since app does not depend on java mode
44+ val formatter = clazz
45+ .getDeclaredConstructor()
46+ .newInstance()
47+
48+ val method = clazz.getMethod(" format" , String ::class .java)
49+ val code = File (file).readText()
50+
51+ val formatted = method.invoke(formatter, code) as String
52+ if (inPlace) {
53+ File (file).writeText(formatted)
54+ return
55+ }
56+ println (formatted)
57+ } catch (e: Exception ) {
58+ throw InternalError (" Failed to invoke main method" , e)
59+ }
60+ }
61+ }
62+ }
0 commit comments