/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace Apache.Ignite.Compute;

using System;
using NodaTime;

/// <summary>
/// Compute job state.
/// </summary>
/// <param name="Id">Job ID.</param>
/// <param name="Status">Job status.</param>
/// <param name="CreateTime">Create time.</param>
/// <param name="StartTime">Start time (<c>null</c> when not yet started).</param>
/// <param name="FinishTime">Finish time (<c>null</c> when not yet finished).</param>
public sealed record JobState(
    Guid Id,
    JobStatus Status,
    Instant CreateTime,
    Instant? StartTime,
    Instant? FinishTime);
