def jobEventToJobEventTimeLine(jobEvent: JobEvent): JobEventTimeline = {
val OpFields(stepId, jobBaseStepId, fieldId) = extractFromOp(jobEvent.getOp)
JobEventTimeline(
jobEvent.getJobId,
if (jobEvent.isSetTyp) Some(jobEvent.getTyp.toString) else None,
if (jobEvent.isSetInPlanning) Some(jobEvent.inPlanning) else None,
jobEvent.getPedigree.getTeamId,
jobEvent.getPedigree.getActorId,
if (jobEvent.getPedigree.isSetAdminActorId) Some(jobEvent.getPedigree.getAdminActorId) else None,
jobEvent.getPedigree.getSessionId,
if (jobEvent.getPedigree.isSetClientSessionId) Some(jobEvent.getPedigree.getClientSessionId) else None,
jobEvent.getPedigree.getCreatedAt,
jobEvent.getPedigree.getSeqId,
if (jobEvent.getPedigree.isSetIsSideEffect) Some(jobEvent.getPedigree.isSideEffect) else None,
jobEvent.getOp.getSetField.toString,
stepId,
jobBaseStepId,
fieldId,
if (jobEvent.isSetReceivedAt) Some(jobEvent.getReceivedAt) else None
)
}
def ToJobEvent(binData: Array[Byte]): Option[JobEventTimeline] = FuncUtils.deserializeJobEvent(binData) flatMap Some(jobEventToJobEventTimeLine(_))
I'm trying to use flatMap as a bind operator to apply a monadic Value to a monad however my IDE is saying flatMap can't be resolved. What is the correct way to do this?
Some(jobEventToJobEventTimeLine(_))
means Some(x => jobEventToJobEventTimeLine(x))
, not x => Some(jobEventToJobEventTimeLine(x))
, so the types don't match. Write
FuncUtils.deserializeJobEvent(binData).flatMap { x => Some(jobEventToJobEventTimeLine(x)) }
explicitly.
Also, if (jobEvent.isSetTyp) Some(jobEvent.getTyp.toString) else None
can be written as Option.when(jobEvent.isSetTyp)(jobEvent.getTyp.toString)
.