rusaint(ru-saint, 루세인트)는 숭실대학교 u-saint를 정확하고 빠르게, 간편하게 파싱하고 다양한 환경에서 조작할 수 있는 Rust 기반 비공식 u-saint 클라이언트입니다.
u-saint의 기반인 SAP Web Dynpro에서 사용하는 Lightspeed 라이브러리의 최소 동작을 구현하여 안전하게 u-saint 내부 요소들을 조작하고 파싱할 수 있습니다.
- JS 런타임 없음 — JS 런타임 없이 자체적으로 요청과 응답에 따른 처리를 수행하므로 HTTPS 요청이 가능한 모든 환경에서 실행 가능합니다.
- 빠른 속도 — 네이티브 환경으로 컴파일되는 Rust를 이용하고, 휴리스틱 없이 요청이 완료되면 곧바로 실행되어 빠르게 u-saint 를 조작 및 파싱 가능합니다.
- 멀티플랫폼 지원 — UniFFI를 통한 Kotlin, Swift, React-Native, Python 지원을 제공하여 다양한 플랫폼에서 간편하게 이용할 수 있습니다.
- 간편한 기능 정의 — rusaint 에서 지원하지 않는 u-saint 애플리케이션에 대한 파싱 및 지원을 제공하는 API를 이용해 간편하게 정의할 수 있습니다.
설치
문서
예시
use ;
use USaintClientBuilder;
use USaintSession;
use RusaintError;
use Arc;
// 성적 정보를 출력하는 애플리케이션
async
async
개발
개발 및 테스트를 위해 아래와 같은 요구사항이 필요합니다:
SSO_ID,SSO_PASSWORD환경 변수 (숭실대학교 SSO ID/비밀번호)TARGET_YEAR,TARGET_SEMESTER환경 변수 (학년도/학기, 예시:2022,1)- 테스트를 실행하기 전에,
cargo run -p rusaint-session-helper >> session.json을 실행하여 세션을 파일로 생성하여야 합니다 (사용하는 쉘에 따라 정확한 명령어는 달라질 수 있습니다).- 세션 파일 경로를 변경하고 싶다면,
SSO_SESSION_FILE환경 변수에 경로를 입력하여 변경할 수 있습니다.
- 세션 파일 경로를 변경하고 싶다면,
rusaint는 빠른 테스트 실행을 위해cargo-nextest를 사용합니다. (cargo install cargo-nextest를 통해 설치할 수 있습니다)cargo nextest run을 실행하여 테스트를 실행합니다.
멀티 플랫폼
rusaint는 uniffi를 이용한 FFI 멀티플랫폼을 지원합니다. 현재 지원하는 플랫폼은 다음과 같습니다.
- Android (Kotlin)
- iOS (Swift)
- React Native
- Python
Android (Kotlin)
Maven Central에서 설치하기
- Maven Central을 gradle 저장소에 추가
repositories {
mavenCentral()
// ... any other repositories
}
- rusaint를 의존성에 추가
dependencies {
implementation("dev.eatsteak:rusaint:0.13.5")
}
소스 코드에서 빌드
languages/kotlin 내부의 README.md 파일을 참고하세요.
iOS (Swift)
SPM을 이용하여 설치
SPM 레포지토리로 설치할 수 있습니다.
소스 코드에서 빌드
languages/swift 내부의 build.sh 파일을 실행하여 .xcframework 형태로 빌드할 수 있습니다.
React Native (Turbo Module)
패키지 매니저를 이용하여 설치
Expo에서 사용하기
@rusaint/react-native 는 네이티브 바이너리를 사용합니다. React Native Community Autolink 및 Expo Autolink를 사용한 자동 링킹을 지원하므로 별개의 설정은 필요하지 않으나, Expo Go를 사용할 수 없음에 주의하시길 바랍니다.
소스 코드에서 빌드
# ./languages/react-native
Python
PyPI에서 설치
# Using pip
# Using uv
소스 코드에서 빌드
rusaint는 maturin을 사용하여 Python wheel을 빌드합니다.
# ./languages/python
# with uv