package com.novoda.todoapp.task.data.model; import com.google.auto.value.AutoValue; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @AutoValue public abstract class Task { public static Builder builder() { return new AutoValue_Task.Builder() .title(Optional.<String>absent()) .description(Optional.<String>absent()) .isCompleted(false); } public abstract Id id(); public abstract Optional<String> title(); public abstract Optional<String> description(); public abstract boolean isCompleted(); public abstract Builder toBuilder(); public Task complete() { return toBuilder() .isCompleted(true) .build(); } public Task activate() { return toBuilder() .isCompleted(false) .build(); } public Optional<String> titleOrDescription() { return title().or(description()); } @AutoValue.Builder public abstract static class Builder { public abstract Builder id(Id id); public abstract Builder isCompleted(boolean isCompleted); public Builder title(String title) { Preconditions.checkState(!title.isEmpty(), "An empty title is not valid, please use Optional.absent()"); return title(Optional.of(title)); } public Builder description(String description) { Preconditions.checkState(!description.isEmpty(), "An empty description is not valid, please use Optional.absent()"); return description(Optional.of(description)); } public abstract Builder title(Optional<String> title); public abstract Builder description(Optional<String> description); public Task build() { Task task = autoBuild(); Preconditions.checkState( task.title().or(task.description()).isPresent(), "Please provide one of (Title, Description)" ); return task; } abstract Task autoBuild(); } }