Skip to content

Commit

Permalink
refactor: 🎨 remove hardcoded literal indices for command arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesNZL committed May 16, 2023
1 parent 6bb5d8f commit 67f9d56
Showing 1 changed file with 65 additions and 29 deletions.
94 changes: 65 additions & 29 deletions src/TogglTrack.cs
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,14 @@ internal async ValueTask<List<Result>> RequestStartEntry(CancellationToken token
return this.NotifyUnknownError();
}

if (this._selectedProjectId == -1 || query.SearchTerms.Length == 1)
var ArgumentIndices = new
{
Command = 0,
Project = 1,
Description = 2,
};

if (this._selectedProjectId == -1 || query.SearchTerms.Length == ArgumentIndices.Project)
{
this._selectedProjectId = -1;

Expand Down Expand Up @@ -396,11 +403,11 @@ internal async ValueTask<List<Result>> RequestStartEntry(CancellationToken token
);
}

return (string.IsNullOrWhiteSpace(query.SecondToEndSearch))
return (string.IsNullOrWhiteSpace(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Project))))
? projects
: projects.FindAll(result =>
{
return this._context.API.FuzzySearch(query.SecondToEndSearch, $"{result.Title} {Regex.Replace(result.SubTitle, @"(?: \| )?\d+ hours?$", string.Empty)}").Score > 0;
return this._context.API.FuzzySearch(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Project)), $"{result.Title} {Regex.Replace(result.SubTitle, @"(?: \| )?\d+ hours?$", string.Empty)}").Score > 0;
});
}

Expand All @@ -415,7 +422,7 @@ internal async ValueTask<List<Result>> RequestStartEntry(CancellationToken token
? $"{project.name}{clientName}"
: "No Project";

string description = string.Join(" ", query.SearchTerms.Skip(2));
string description = string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Description));

var results = new List<Result>
{
Expand Down Expand Up @@ -501,7 +508,7 @@ internal async ValueTask<List<Result>> RequestStartEntry(CancellationToken token
var startTime = DateTimeOffset.UtcNow + startTimeSpan;

// Remove -t flag from description
string sanitisedDescription = string.Join(" ", query.SearchTerms.Take(Array.IndexOf(query.SearchTerms, Settings.TimeSpanFlag)).Skip(2));
string sanitisedDescription = string.Join(" ", query.SearchTerms.Take(Array.IndexOf(query.SearchTerms, Settings.TimeSpanFlag)).Skip(ArgumentIndices.Description));

results.Add(new Result
{
Expand Down Expand Up @@ -674,8 +681,17 @@ internal async ValueTask<List<Result>> RequestEditEntry(CancellationToken token,
};
}

var ArgumentIndices = new
{
Command = 0,
// If it exists
Project = 1,
DescriptionWithoutProject = 1,
DescriptionWithProject = 2,
};

// Reset project selection if query emptied to 'tgl edit '
if (query.SearchTerms.Length == 1 && this._editProjectState == TogglTrack.EditProjectState.ProjectSelected)
if (query.SearchTerms.Length == (ArgumentIndices.Command + 1) && this._editProjectState == TogglTrack.EditProjectState.ProjectSelected)
{
this._selectedProjectId = -1;
this._editProjectState = TogglTrack.EditProjectState.NoProjectChange;
Expand Down Expand Up @@ -742,11 +758,11 @@ internal async ValueTask<List<Result>> RequestEditEntry(CancellationToken token,
);
}

return (string.IsNullOrWhiteSpace(query.SecondToEndSearch))
return (string.IsNullOrWhiteSpace(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Project))))
? projects
: projects.FindAll(result =>
{
return this._context.API.FuzzySearch(query.SecondToEndSearch, $"{result.Title} {Regex.Replace(result.SubTitle, @"(?: \| )?\d+ hours?$", string.Empty)}").Score > 0;
return this._context.API.FuzzySearch(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Project)), $"{result.Title} {Regex.Replace(result.SubTitle, @"(?: \| )?\d+ hours?$", string.Empty)}").Score > 0;
});
}

Expand All @@ -763,9 +779,14 @@ internal async ValueTask<List<Result>> RequestEditEntry(CancellationToken token,
? $"{project.name}{clientName}"
: "No Project";

string description = (this._editProjectState == TogglTrack.EditProjectState.ProjectSelected)
? string.Join(" ", query.SearchTerms.Skip(2))
: query.SecondToEndSearch;
string description = string.Join(
" ",
query.SearchTerms.Skip(
(this._editProjectState == TogglTrack.EditProjectState.ProjectSelected)
? ArgumentIndices.DescriptionWithProject
: ArgumentIndices.DescriptionWithoutProject
)
);

var results = new List<Result>
{
Expand Down Expand Up @@ -852,11 +873,16 @@ internal async ValueTask<List<Result>> RequestEditEntry(CancellationToken token,
var newElapsed = elapsed.Subtract(startTimeSpan);

// Remove -t flag from description
string sanitisedDescription = string.Join(" ", query.SearchTerms.Take(Array.IndexOf(query.SearchTerms, Settings.TimeSpanFlag)).Skip(
(this._editProjectState == TogglTrack.EditProjectState.ProjectSelected)
? 2
: 1
));
string sanitisedDescription = string.Join(
" ",
query.SearchTerms
.Take(Array.IndexOf(query.SearchTerms, Settings.TimeSpanFlag))
.Skip(
(this._editProjectState == TogglTrack.EditProjectState.ProjectSelected)
? ArgumentIndices.DescriptionWithProject
: ArgumentIndices.DescriptionWithoutProject
)
);

results.Add(new Result
{
Expand Down Expand Up @@ -1262,6 +1288,12 @@ internal async ValueTask<List<Result>> RequestContinueEntry(CancellationToken to
};
}

var ArgumentIndices = new
{
Command = 0,
Description = 1,
};

var entries = timeEntries.ConvertAll(timeEntry =>
{
var elapsed = (timeEntry.duration < 0)
Expand Down Expand Up @@ -1297,11 +1329,11 @@ internal async ValueTask<List<Result>> RequestContinueEntry(CancellationToken to
};
});

return (string.IsNullOrWhiteSpace(query.SecondToEndSearch))
return (string.IsNullOrWhiteSpace(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Description))))
? entries
: entries.FindAll(result =>
{
return this._context.API.FuzzySearch(query.SecondToEndSearch, result.Title).Score > 0;
return this._context.API.FuzzySearch(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Description)), result.Title).Score > 0;
});
}

Expand Down Expand Up @@ -1336,10 +1368,17 @@ internal async ValueTask<List<Result>> RequestViewReports(CancellationToken toke
};
}

var ArgumentIndices = new
{
Command = 0,
Span = 1,
Grouping = 2,
};

/*
* Report span selection --- tgl view [day | week | month | year]
*/
if (query.SearchTerms.Length == 1 || !Settings.ViewSpanArguments.Values.ToList().Exists(span => span.Argument == query.SearchTerms[1]))
if (query.SearchTerms.Length == ArgumentIndices.Span || !Settings.ViewSpanArguments.Values.ToList().Exists(span => span.Argument == query.SearchTerms[ArgumentIndices.Span]))
{
var spans = Settings.ViewSpanArguments.Values.ToList().ConvertAll(span =>
{
Expand All @@ -1358,19 +1397,18 @@ internal async ValueTask<List<Result>> RequestViewReports(CancellationToken toke
};
});

return (string.IsNullOrWhiteSpace(query.SecondToEndSearch))
return (string.IsNullOrWhiteSpace(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Span))))
? spans
: spans.FindAll(result =>
{
return this._context.API.FuzzySearch(query.SecondToEndSearch, result.Title).Score > 0;
return this._context.API.FuzzySearch(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Span)), result.Title).Score > 0;
});
}

/*
* Report groupinging selection --- tgl view [duration] [projects | clients | entries]
"View tracked time report by Project"
*/
if (query.SearchTerms.Length == 2 || !Settings.ViewGroupingArguments.Values.ToList().Exists(grouping => grouping.Argument == query.SearchTerms[2]))
if (query.SearchTerms.Length == ArgumentIndices.Grouping || !Settings.ViewGroupingArguments.Values.ToList().Exists(grouping => grouping.Argument == query.SearchTerms[ArgumentIndices.Grouping]))
{
var groupings = Settings.ViewGroupingArguments.Values.ToList().ConvertAll(grouping =>
{
Expand All @@ -1389,18 +1427,16 @@ internal async ValueTask<List<Result>> RequestViewReports(CancellationToken toke
};
});

return (string.IsNullOrWhiteSpace(string.Join(" ", query.SearchTerms.Skip(2))))
return (string.IsNullOrWhiteSpace(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Grouping))))
? groupings
: groupings.FindAll(result =>
{
return this._context.API.FuzzySearch(string.Join(" ", query.SearchTerms.Skip(2)), result.Title).Score > 0;
return this._context.API.FuzzySearch(string.Join(" ", query.SearchTerms.Skip(ArgumentIndices.Grouping)), result.Title).Score > 0;
});
}

// TODO: use Regex capture to parse these args from the query
// or a better way if i can think of anything else
string spanArgument = query.SearchTerms[1];
string groupingArgument = query.SearchTerms[2];
string spanArgument = query.SearchTerms[ArgumentIndices.Span];
string groupingArgument = query.SearchTerms[ArgumentIndices.Grouping];

var spanConfiguration = Settings.ViewSpanArguments.Values.ToList().Find(span => span.Argument == spanArgument);

Expand Down

0 comments on commit 67f9d56

Please sign in to comment.