func PrintDetailedDatumInfo(w io.Writer, datumInfo *ppsclient.DatumInfo) {
	fmt.Fprintf(w, "ID\t%s\n", datumInfo.Datum.ID)
	fmt.Fprintf(w, "Job ID\t%s\n", datumInfo.Datum.Job.ID)
	fmt.Fprintf(w, "State\t%s\n", datumInfo.State)
	fmt.Fprintf(w, "Data Downloaded\t%s\n", pretty.Size(datumInfo.Stats.DownloadBytes))
	fmt.Fprintf(w, "Data Uploaded\t%s\n", pretty.Size(datumInfo.Stats.UploadBytes))

	totalTime := client.GetDatumTotalTime(datumInfo.Stats).String()
	fmt.Fprintf(w, "Total Time\t%s\n", totalTime)

	var downloadTime string
	dl, err := types.DurationFromProto(datumInfo.Stats.DownloadTime)
	if err != nil {
		downloadTime = err.Error()
	}
	downloadTime = dl.String()
	fmt.Fprintf(w, "Download Time\t%s\n", downloadTime)

	var procTime string
	proc, err := types.DurationFromProto(datumInfo.Stats.ProcessTime)
	if err != nil {
		procTime = err.Error()
	}
	procTime = proc.String()
	fmt.Fprintf(w, "Process Time\t%s\n", procTime)

	var uploadTime string
	ul, err := types.DurationFromProto(datumInfo.Stats.UploadTime)
	if err != nil {
		uploadTime = err.Error()
	}
	uploadTime = ul.String()
	fmt.Fprintf(w, "Upload Time\t%s\n", uploadTime)

	fmt.Fprintf(w, "PFS State:\n")
	tw := ansiterm.NewTabWriter(w, 10, 1, 3, ' ', 0)
	PrintFileHeader(tw)
	PrintFile(tw, datumInfo.PfsState)
	tw.Flush()
	fmt.Fprintf(w, "Inputs:\n")
	tw = ansiterm.NewTabWriter(w, 10, 1, 3, ' ', 0)
	PrintFileHeader(tw)
	for _, d := range datumInfo.Data {
		PrintFile(tw, d.File)
	}
	tw.Flush()
}
func PrintDetailedDatumInfo(w io.Writer, datumInfo *ppsclient.DatumInfo) {
	fmt.Fprintf(w, "ID\t%s\n", datumInfo.Datum.ID)
	fmt.Fprintf(w, "Job ID\t%s\n", datumInfo.Datum.Job.ID)
	fmt.Fprintf(w, "State\t%s\n", datumInfo.State)
	fmt.Fprintf(w, "Data Downloaded\t%s\n", pretty.Size(datumInfo.Stats.DownloadBytes))
	fmt.Fprintf(w, "Data Uploaded\t%s\n", pretty.Size(datumInfo.Stats.UploadBytes))

	totalTime := client.GetDatumTotalTime(datumInfo.Stats).String()
	fmt.Fprintf(w, "Total Time\t%s\n", totalTime)

	var downloadTime string
	dl, err := types.DurationFromProto(datumInfo.Stats.DownloadTime)
	if err != nil {
		downloadTime = err.Error()
	}
	downloadTime = dl.String()
	fmt.Fprintf(w, "Download Time\t%s\n", downloadTime)

	var procTime string
	proc, err := types.DurationFromProto(datumInfo.Stats.ProcessTime)
	if err != nil {
		procTime = err.Error()
	}
	procTime = proc.String()
	fmt.Fprintf(w, "Process Time\t%s\n", procTime)

	var uploadTime string
	ul, err := types.DurationFromProto(datumInfo.Stats.UploadTime)
	if err != nil {
		uploadTime = err.Error()
	}
	uploadTime = ul.String()
	fmt.Fprintf(w, "Upload Time\t%s\n", uploadTime)

	fmt.Fprintf(w, "PFS State:\n")
	tw := ansiterm.NewTabWriter(w, 10, 1, 3, ' ', 0)
	PrintFileHeader(tw)
	PrintFile(tw, datumInfo.PfsState)
	tw.Flush()
	fmt.Fprintf(w, "Inputs:\n")
	tw = ansiterm.NewTabWriter(w, 10, 1, 3, ' ', 0)
	PrintFileHeader(tw)
	for _, d := range datumInfo.Data {
		PrintFile(tw, d.File)
	}
	tw.Flush()
}
func PrintDetailedDatumInfo ( w io . Writer , datumInfo * ppsclient . DatumInfo ) { fmt . Fprintf ( w , " \t \n " , datumInfo . Datum . ID ) fmt . Fprintf ( w , " \t \n " , datumInfo . Datum . Job . ID ) fmt . Fprintf ( w , " \t \n " , datumInfo . State ) fmt . Fprintf ( w , " \t \n " , pretty . Size ( datumInfo . Stats . DownloadBytes ) ) fmt . Fprintf ( w , " \t \n " , pretty . Size ( datumInfo . Stats . UploadBytes ) ) totalTime := client . GetDatumTotalTime ( datumInfo . Stats ) . String ( ) fmt . Fprintf ( w , " \t \n " , totalTime ) var downloadTime string dl , err := types . DurationFromProto ( datumInfo . Stats . DownloadTime ) if err != nil { downloadTime = err . Error ( ) } downloadTime = dl . String ( ) fmt . Fprintf ( w , " \t \n " , downloadTime ) var procTime string proc , err := types . DurationFromProto ( datumInfo . Stats . ProcessTime ) if err != nil { procTime = err . Error ( ) } procTime = proc . String ( ) fmt . Fprintf ( w , " \t \n " , procTime ) var uploadTime string ul , err := types . DurationFromProto ( datumInfo . Stats . UploadTime ) if err != nil { uploadTime = err . Error ( ) } uploadTime = ul . String ( ) fmt . Fprintf ( w , " \t \n " , uploadTime ) fmt . Fprintf ( w , " \n " ) tw := ansiterm . NewTabWriter ( w , 10 , 1 , 3 , ' ' , 0 ) PrintFileHeader ( tw ) PrintFile ( tw , datumInfo . PfsState ) tw . Flush ( ) fmt . Fprintf ( w , " \n " ) tw = ansiterm . NewTabWriter ( w , 10 , 1 , 3 , ' ' , 0 ) PrintFileHeader ( tw ) for _ , d := range datumInfo . Data { PrintFile ( tw , d . File ) } tw . Flush ( ) }
// PrintDetailedDatumInfo pretty-prints detailed info about a datum
PrintDetailedDatumInfo pretty - prints detailed info about a datum