grades can be digested
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
#include "nlohmann/json_fwd.hpp"
|
||||||
#include "skwyward-api-utils.hpp"
|
#include "skwyward-api-utils.hpp"
|
||||||
#include "spdlog/spdlog.h"
|
#include "spdlog/spdlog.h"
|
||||||
|
|
||||||
@@ -13,5 +14,8 @@ int main (int argc, char *argv[]) {
|
|||||||
|
|
||||||
api_utils::ErrorResponse test_login = api_methods::get_auth_status(base_uri, test_username, test_password);
|
api_utils::ErrorResponse test_login = api_methods::get_auth_status(base_uri, test_username, test_password);
|
||||||
spdlog::info("Auth attempt response : {}", test_login.success);
|
spdlog::info("Auth attempt response : {}", test_login.success);
|
||||||
|
|
||||||
|
api_utils::GradesResponse test_grades = api_methods::get_grades(base_uri, test_username, test_password);
|
||||||
|
spdlog::info("Grades: {}", nlohmann::json {test_grades}.dump());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "skwyward-api-utils.hpp"
|
#include "skwyward-api-utils.hpp"
|
||||||
|
#include "nlohmann/json_fwd.hpp"
|
||||||
|
|
||||||
#include <cpr/cpr.h>
|
#include <cpr/cpr.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@@ -9,20 +10,50 @@ using nlohmann::json;
|
|||||||
|
|
||||||
// ---------- Helpers ----------
|
// ---------- Helpers ----------
|
||||||
|
|
||||||
static double parse_percent_score(const json& j) {
|
static double parse_percent_score(const nlohmann::json& j) {
|
||||||
|
// Case 1: real number already
|
||||||
if (j.is_number()) {
|
if (j.is_number()) {
|
||||||
return j.get<double>();
|
return j.get<double>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Case 2: string input
|
||||||
if (j.is_string()) {
|
if (j.is_string()) {
|
||||||
std::string s = j.get<std::string>();
|
std::string s = j.get<std::string>();
|
||||||
s.erase(std::remove(s.begin(), s.end(), '%'), s.end());
|
|
||||||
return std::stod(s);
|
// Trim whitespace
|
||||||
|
s.erase(0, s.find_first_not_of(" \t\n\r"));
|
||||||
|
s.erase(s.find_last_not_of(" \t\n\r") + 1);
|
||||||
|
|
||||||
|
// Empty or known non-values
|
||||||
|
if (s.empty() || s == "N/A" || s == "--") {
|
||||||
|
return std::numeric_limits<double>::quiet_NaN();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove trailing %
|
||||||
|
if (!s.empty() && s.back() == '%') {
|
||||||
|
s.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fast numeric parse (no exceptions)
|
||||||
|
double value{};
|
||||||
|
auto [ptr, ec] = std::from_chars(
|
||||||
|
s.data(),
|
||||||
|
s.data() + s.size(),
|
||||||
|
value
|
||||||
|
);
|
||||||
|
|
||||||
|
if (ec == std::errc()) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::numeric_limits<double>::quiet_NaN();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0.0;
|
// Everything else (null, object, etc.)
|
||||||
|
return std::numeric_limits<double>::quiet_NaN();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------- Login ----------
|
// ---------- Login ----------
|
||||||
|
|
||||||
void to_json(json& j, const Login& r) {
|
void to_json(json& j, const Login& r) {
|
||||||
@@ -149,7 +180,7 @@ api_utils::ErrorResponse get_auth_status(
|
|||||||
std::string username,
|
std::string username,
|
||||||
std::string password
|
std::string password
|
||||||
) {
|
) {
|
||||||
api_utils::Login login{username, password};
|
api_utils::Login login = api_utils::Login{username, password};
|
||||||
|
|
||||||
cpr::Response r = cpr::Post(
|
cpr::Response r = cpr::Post(
|
||||||
cpr::Url{url + "/check-auth"},
|
cpr::Url{url + "/check-auth"},
|
||||||
@@ -160,6 +191,15 @@ api_utils::ErrorResponse get_auth_status(
|
|||||||
return nlohmann::json::parse(r.text)
|
return nlohmann::json::parse(r.text)
|
||||||
.get<api_utils::ErrorResponse>();
|
.get<api_utils::ErrorResponse>();
|
||||||
}
|
}
|
||||||
|
api_utils::GradesResponse get_grades(std::string url, std::string username, std::string password) {
|
||||||
|
api_utils::Login login = api_utils::Login{username, password};
|
||||||
|
cpr::Response r = cpr::Post(
|
||||||
|
cpr::Url{url + "/fetch-grades"},
|
||||||
|
cpr::Body{nlohmann::json(login).dump()},
|
||||||
|
cpr::Header{{"Content-Type", "application/json"}}
|
||||||
|
);
|
||||||
|
|
||||||
|
return nlohmann::json::parse(r.text).get<api_utils::GradesResponse>();
|
||||||
|
}
|
||||||
} // namespace api_methods
|
} // namespace api_methods
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ struct StatusResponse {
|
|||||||
struct AssignmentGrade {
|
struct AssignmentGrade {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string dueDate;
|
std::string dueDate;
|
||||||
double score; // <-- parsed from "72.00%"
|
double score;
|
||||||
std::string attempts;
|
std::string attempts;
|
||||||
bool isMajorGrade;
|
bool isMajorGrade;
|
||||||
};
|
};
|
||||||
@@ -80,5 +80,6 @@ namespace api_methods {
|
|||||||
std::string username,
|
std::string username,
|
||||||
std::string password
|
std::string password
|
||||||
);
|
);
|
||||||
|
api_utils::GradesResponse get_grades( std::string url, std::string username, std::string password);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user