Compare commits

...
Author SHA1 Message Date
phoenix a9f27a3f29 bump: swoosh
swoosh Build / Check (pull_request) Successful in 34s
Release Tagging / release (pull_request) Successful in 39s
swoosh Build / Rustfmt (pull_request) Successful in 28s
swoosh Build / Clippy (pull_request) Successful in 29s
swoosh Build / Test Suite (pull_request) Successful in 1m13s
swoosh Build / build (pull_request) Successful in 27s
2026-06-04 20:32:59 -04:00
phoenix fcc8c3966c Code cleanup 2026-06-04 20:32:31 -04:00
phoenix 4d3bb7778a Code cleanup
Release Tagging / release (pull_request) Successful in 27s
swoosh Build / Check (pull_request) Successful in 27s
swoosh Build / Rustfmt (pull_request) Successful in 29s
swoosh Build / Test Suite (pull_request) Successful in 57s
swoosh Build / build (pull_request) Successful in 28s
swoosh Build / Clippy (pull_request) Successful in 1m31s
2026-06-04 20:26:41 -04:00
phoenix b5fd3dbfff cargo fmt
swoosh Build / Check (pull_request) Successful in 35s
Release Tagging / release (pull_request) Failing after 57s
swoosh Build / Test Suite (pull_request) Successful in 28s
swoosh Build / Rustfmt (pull_request) Successful in 26s
swoosh Build / build (pull_request) Successful in 1m43s
swoosh Build / Clippy (pull_request) Failing after 31s
2026-06-04 20:23:52 -04:00
phoenix bb58dafed3 Code cleanup 2026-06-04 20:23:43 -04:00
phoenix c71f5bed7a Updated comments 2026-06-04 20:18:21 -04:00
phoenix 6d5e10857d Updating comments
Release Tagging / release (pull_request) Successful in 45s
swoosh Build / Check (pull_request) Successful in 59s
swoosh Build / Rustfmt (pull_request) Successful in 25s
swoosh Build / Clippy (pull_request) Failing after 27s
swoosh Build / build (pull_request) Successful in 46s
swoosh Build / Test Suite (pull_request) Failing after 2m6s
2026-06-04 20:15:15 -04:00
phoenix 70f5261b49 Changing return type
Release Tagging / release (pull_request) Successful in 33s
swoosh Build / Check (pull_request) Successful in 1m18s
swoosh Build / Rustfmt (pull_request) Successful in 26s
swoosh Build / Test Suite (pull_request) Failing after 1m19s
swoosh Build / build (pull_request) Successful in 31s
swoosh Build / Clippy (pull_request) Failing after 42s
2026-06-03 21:59:16 -04:00
5 changed files with 12 additions and 142 deletions
Generated
+1 -1
View File
@@ -1573,7 +1573,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "swoosh"
version = "0.2.1"
version = "0.2.2"
dependencies = [
"base64-ng",
"const_format",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "swoosh"
version = "0.2.1"
version = "0.2.2"
edition = "2024"
rust-version = "1.95"
description = "Library to send text messages"
+9 -108
View File
@@ -1,5 +1,3 @@
// use josekit::jwk::alg::ec::EcCurve::P256;
pub mod types;
pub async fn send_mssage(
@@ -7,7 +5,7 @@ pub async fn send_mssage(
contact: &textsender_models::contact::Contact,
param: crate::twilio::types::Parameters,
config: &textsender_models::config::auxiliary::TwilioConfig,
) -> Result<crate::twilio::api::types::TwilioAPIMessage, std::io::Error> {
) -> Result<reqwest::Response, std::io::Error> {
if config.account_sid.is_empty() {
Err(std::io::Error::other("Account SID is empty"))
} else if config.auth_token.is_empty() {
@@ -23,7 +21,6 @@ pub async fn send_mssage(
);
headers.insert("Accept", "application/json".parse().unwrap());
let auth = generate_auth(config).unwrap();
// headers.insert("Authorization", "Basic QUNlZmExZWY1MTYzMTRjOWQxYTY4Y2JkNjU3ZGU0OTI3NzpmNGExZjJiMGI3OWVhMzczNTA3OGMyZDhlZTk2ODRlMQ==".parse()?);
headers.insert("Authorization", auth.parse().unwrap());
let mut params = std::collections::HashMap::new();
@@ -41,10 +38,7 @@ pub async fn send_mssage(
// params.insert("PersistentAction", "string");
params.insert("ShortenUrls", "true");
let date = match param.schedule_at {
Some(date_value) => {
let converted = date_value.to_string();
converted
}
Some(date_value) => date_value.to_string(),
None => String::new(),
};
if param.schedule && is_scheduleable(&Some(now), &param.schedule_at) {
@@ -62,38 +56,14 @@ pub async fn send_mssage(
config.account_sid
);
// let client = reqwest::Client::new();
/*
let request = client.request(reqwest::Method::POST, url)
.headers(headers)
.form(&params);
*/
let request = client.post(url).headers(headers).form(&params);
match request.send().await {
Ok(response) => {
match response
.json::<crate::twilio::api::types::TwilioAPIMessage>()
.await
{
Ok(resp) => Ok(resp),
Err(err) => Err(std::io::Error::other(err)),
}
/*
match response.text().await {
Ok(body) => {
let mut obj = crate::twilio::api::types::TwilioAPIMessage {
..Default::default()
};
Ok(obj)
}
Err(err) => {
Err(std::io::Error::other(err))
}
}
*/
}
Ok(response) => match response.status() {
reqwest::StatusCode::OK => Ok(response),
status => Err(std::io::Error::other(format!(
"Unaccounted status: {status:?}"
))),
},
Err(err) => Err(std::io::Error::other(err.to_string())),
}
}
@@ -112,18 +82,7 @@ fn generate_auth(
}
}
/*
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/x-www-form-urlencoded".parse()?);
headers.insert("Accept", "application/json".parse()?);
headers.insert("Authorization", "Basic QUNlZmExZWY1MTYzMTRjOWQxYTY4Y2JkNjU3ZGU0OTI3NzpmNGExZjJiMGI3OWVhMzczNTA3OGMyZDhlZTk2ODRlMQ==".parse()?);
let mut params = std::collections::HashMap::new();
params.insert("To", "16303831708");
params.insert("StatusCallback", "http://OjQozHznkhNTTR.vpnrM1zdXFuiQ");
params.insert("MaxPrice", "1");
params.insert("ProvideFeedback", "true");
@@ -136,75 +95,17 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
params.insert("PersistentAction", "string");
params.insert("PersistentAction", "string");
params.insert("ShortenUrls", "true");
params.insert("ScheduleType", "fixed");
params.insert("SendAt", "2026-06-03T19:50:00.0Z");
params.insert("SendAsMms", "true");
params.insert("RiskCheck", "enable");
params.insert("From", "12243026041");
params.insert("MessagingServiceSid", "MG803f3676706b92eb02e18dd820c447f2");
params.insert("Body", "This is a test");
let request = client.request(reqwest::Method::POST, "https://api.twilio.com/2010-04-01/Accounts/ACefa1ef516314c9d1a68cbd657de49277/Messages.json")
.headers(headers)
.form(&params);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}
*/
/**
func (m *MessageSender) Send(msg message.Message, number contact.Contact, sendTime *time.Time) (*types.TwilioResult, map[string]any, error) {
if m.Config == nil {
return nil, nil, fmt.Errorf("Config has not been initialized")
}
now := time.Now()
client := twilio.NewRestClientWithParams(twilio.ClientParams{
Username: m.Config.AccountSID,
Password: m.Config.AuthToken,
})
params := &twilioApi.CreateMessageParams{}
params.SetTo(number.PhoneNumber)
params.SetFrom(m.Config.Number)
params.SetMessagingServiceSid(m.Config.ServiceSID)
params.SetBody(msg.Content)
if sendTime != nil && isSchedulable(&now, sendTime) {
params.SetSendAt(*sendTime)
params.SetScheduleType(Schedule_Type)
}
if resp, err := client.Api.CreateMessage(params); err != nil {
return nil, nil, fmt.Errorf("Error sending message: %v", err)
} else {
if twilioRespMarshaled, err := json.Marshal(*resp); err != nil {
return nil, nil, fmt.Errorf("Error parsing result: %v", err)
} else {
var rawObject map[string]any
if err := json.Unmarshal(twilioRespMarshaled, &rawObject); err != nil {
return resp, nil, err
} else {
return resp, rawObject, nil
}
}
}
}
func isSchedulable(now *time.Time, scheduled *time.Time) bool {
early := now.Add(Schedulable_Limit_In_Seconds * time.Second)
if scheduled.After(early) {
return true
} else {
return false
}
}
*/
fn is_scheduleable(
now: &Option<time::OffsetDateTime>,
scheduled: &Option<time::OffsetDateTime>,
@@ -215,7 +116,7 @@ fn is_scheduleable(
.unwrap()
.checked_add(time::Duration::seconds(300))
.unwrap();
if *schedule_at > early { true } else { false }
*schedule_at > early
}
None => false,
}
-27
View File
@@ -36,30 +36,3 @@ pub struct TwilioAPIMessage {
pub struct SubresourceURI {
pub media: String,
}
/*
{
"account_sid": "ACefa1ef516314c9d1a68cbd657de49277",
"api_version": "2010-04-01",
"body": "This is a test",
"date_created": "Wed, 03 Jun 2026 19:40:55 +0000",
"date_sent": null,
"date_updated": "Wed, 03 Jun 2026 19:40:55 +0000",
"direction": "outbound-api",
"error_code": null,
"error_message": null,
"from": "+12243026041",
"messaging_service_sid": "MG803f3676706b92eb02e18dd820c447f2",
"num_media": "0",
"num_segments": "0",
"price": null,
"price_unit": null,
"sid": "SMf5c09c776c931bdb00c6e274da2ce34d",
"status": "scheduled",
"subresource_uris": {
"media": "/2010-04-01/Accounts/ACefa1ef516314c9d1a68cbd657de49277/Messages/SMf5c09c776c931bdb00c6e274da2ce34d/Media.json"
},
"to": "+16303831708",
"uri": "/2010-04-01/Accounts/ACefa1ef516314c9d1a68cbd657de49277/Messages/SMf5c09c776c931bdb00c6e274da2ce34d.json"
}
*/
+1 -5
View File
@@ -1,8 +1,4 @@
// Things needed to send a message
// Contact - Receipient to send to (textsender-models)
// Message - The content to sent (textsender-models)
// Parameters - Controls flow of sending message
// Config - Contains info needed to send message (textsender-models)
/// Parameters - Controls flow of sending message
pub struct Parameters {
pub schedule: bool,
pub schedule_at: Option<time::OffsetDateTime>,