const { writeFile , readFile , unlink } = require ( "fs" ) ; const tmp = require ( "tmp" ) ; const { callback } = require ( "awaiting" ) ; const { spawn } = require ( "child_process" ) ; import { Options } from "./index" ; function close ( proc , cb ) { proc . on ( "close" , ( code ) => cb ( undefined , code ) ) ; } function run_gofmt ( input_path ) { const args = [ "-w" , input_path ] ; return spawn ( "gofmt" , args ) ; } function cleanup_error ( err , tmpfn ) { const ret = [ ] ; for ( let line of err . split ( "\n" ) ) { if ( line . startsWith ( tmpfn ) ) { line = line . slice ( tmpfn . length + 1 ) ; } ret . push ( line ) ; } return ret . join ( "\n" ) ; } export async function gofmt ( input , options , logger ) { const input_path = await callback ( tmp . file ) ; try { await callback ( writeFile , input_path , input ) ; let formatter ; switch ( options . parser ) { case "gofmt" : formatter = run_gofmt ( input_path ) ; break ; default : throw Error ( `Unknown Go code formatting utility '${ options . parser }'` ) ; } let stdout = "" ; let stderr = "" ; formatter . stdout . on ( "data" , ( data ) => ( stdout += data . toString ( ) ) ) ; formatter . stderr . on ( "data" , ( data ) => ( stderr += data . toString ( ) ) ) ; const code = await callback ( close , formatter ) ; if ( code >= 1 ) { stdout = cleanup_error ( stdout , input_path ) ; stderr = cleanup_error ( stderr , input_path ) ; const err_msg = `Gofmt code formatting utility "${ options . parser }" exited with code ${ code }\nOutput:\n${ stdout }\n${ stderr }` ; logger . debug ( `gofmt error: ${ err_msg }` ) ; throw Error ( err_msg ) ; } const output = await callback ( readFile , input_path ) ; const s = output . toString ( "utf-8" ) ; return s ; } finally { unlink ( input_path , ( ) => { } ) ; } }